summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/Makefile.am185
-rw-r--r--doc/Makefile.in1207
-rw-r--r--doc/fdl.texi506
-rw-r--r--doc/gpl.texi717
-rw-r--r--doc/lgpl.texi190
-rw-r--r--doc/libunistring.info6200
-rw-r--r--doc/libunistring.texi989
-rw-r--r--doc/libunistring_1.html531
-rw-r--r--doc/libunistring_10.html192
-rw-r--r--doc/libunistring_11.html200
-rw-r--r--doc/libunistring_12.html507
-rw-r--r--doc/libunistring_13.html611
-rw-r--r--doc/libunistring_14.html87
-rw-r--r--doc/libunistring_15.html232
-rw-r--r--doc/libunistring_16.html93
-rw-r--r--doc/libunistring_17.html1526
-rw-r--r--doc/libunistring_18.html770
-rw-r--r--doc/libunistring_19.html188
-rw-r--r--doc/libunistring_2.html141
-rw-r--r--doc/libunistring_3.html107
-rw-r--r--doc/libunistring_4.html864
-rw-r--r--doc/libunistring_5.html296
-rw-r--r--doc/libunistring_6.html451
-rw-r--r--doc/libunistring_7.html125
-rw-r--r--doc/libunistring_8.html2071
-rw-r--r--doc/libunistring_9.html141
-rw-r--r--doc/libunistring_abt.html167
-rw-r--r--doc/libunistring_toc.html164
-rw-r--r--doc/stamp-vti4
-rw-r--r--doc/unicase.texi364
-rw-r--r--doc/uniconv.texi157
-rw-r--r--doc/unictype.texi1145
-rw-r--r--doc/unilbrk.texi88
-rw-r--r--doc/uniname.texi32
-rw-r--r--doc/uninorm.texi299
-rw-r--r--doc/uniregex.texi5
-rw-r--r--doc/unistdio.texi197
-rw-r--r--doc/unistr.texi493
-rw-r--r--doc/unitypes.texi15
-rw-r--r--doc/uniwbrk.texi71
-rw-r--r--doc/uniwidth.texi43
-rw-r--r--doc/version.texi4
42 files changed, 22375 insertions, 0 deletions
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 00000000..a66c69da
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,185 @@
+## Makefile for the doc subdirectory of GNU libunistring.
+## Copyright (C) 2009 Free Software Foundation, Inc.
+##
+## This program is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+## Process this file with automake to produce Makefile.in.
+
+AUTOMAKE_OPTIONS = 1.5 gnits
+EXTRA_DIST =
+MOSTLYCLEANFILES =
+
+# List of -I options referring to directories that contain texinfo sources
+# used by this directory.
+# Should contain at least one -I option, to work around a bug in texi2dvi 1.13,
+# see <http://lists.gnu.org/archive/html/bug-automake/2009-04/msg00029.html>.
+TEXINCLUDES = -I .
+
+MAKEINFO = env LANG= LC_MESSAGES= LC_ALL= LANGUAGE= @MAKEINFO@
+MAKEINFOFLAGS = $(TEXINCLUDES) --no-split
+
+info_TEXINFOS = libunistring.texi
+# List of texinfo sources @included by libunistring.texi, excluding version.texi.
+libunistring_TEXINFOS = \
+ unitypes.texi unistr.texi uniconv.texi unistdio.texi uniname.texi \
+ unictype.texi uniwidth.texi uniwbrk.texi unilbrk.texi uninorm.texi \
+ unicase.texi uniregex.texi \
+ gpl.texi lgpl.texi fdl.texi
+
+# The dependencies of stamp-vti generated by automake are incomplete.
+# So we have to duplicate the entire rule which would otherwise be generated
+# by automake.
+$(srcdir)/stamp-vti: $(info_TEXINFOS) $(libunistring_TEXINFOS) $(top_srcdir)/version.sh
+ (dir=.; test -f ./libunistring.texi || dir=$(srcdir); \
+ set `$(SHELL) $(top_srcdir)/build-aux/mdate-sh $$dir/libunistring.texi`; \
+ echo "@set UPDATED $$1 $$2 $$3"; \
+ echo "@set UPDATED-MONTH $$2 $$3"; \
+ echo "@set EDITION $(VERSION)"; \
+ echo "@set VERSION $(VERSION)") > vti.tmp
+ cmp -s vti.tmp $(srcdir)/version.texi \
+ || (echo "Updating $(srcdir)/version.texi"; \
+ cp vti.tmp $(srcdir)/version.texi)
+ rm -f vti.tmp
+ cp $(srcdir)/version.texi $@
+
+# We distribute only the split HTML documentation.
+# The user can generate the others, via
+# make libunistring.ps
+# make libunistring.pdf
+# make libunistring.html
+
+all-local: html-local
+install-data-local: install-html
+installdirs-local: installdirs-html
+uninstall-local: uninstall-html
+dist-hook: dist-html
+
+html-local: html-split
+# Override of automake's definition. The HTML files we want to distribute are
+# not the ones that automake knows about, and we cannot define HTMLS to a value
+# containing wildcards.
+install-html: install-html-split
+ @:
+uninstall-html: uninstall-html-split
+dist-html: dist-html-split
+
+# CLEANFILES: libunistring.{dvi,ps,pdf,html} are already known to automake.
+MAINTAINERCLEANFILES = libunistring_*.html
+
+
+# Documentation in DVI format.
+
+# Override of automake's definition:
+#TEXI2DVI = @TEXI2DVI@
+TEXI2DVI = @TEXI2DVI@ $(TEXINCLUDES)
+
+# The install-dvi target is already defined by automake.
+
+installdirs-dvi:
+ $(mkdir_p) $(DESTDIR)$(dvidir)
+
+uninstall-dvi:
+ $(RM) $(DESTDIR)$(dvidir)/libunistring.dvi
+
+
+# Documentation in Postscript format.
+
+# Override of automake's definition:
+#DVIPS = @DVIPS@
+DVIPS = @DVIPS@ -D600
+
+libunistring.ps: libunistring.dvi
+ $(DVIPS) -o $@ `if test -f libunistring.dvi; then echo libunistring.dvi; else echo $(srcdir)/libunistring.dvi; fi`
+
+# The install-ps target is already defined by automake.
+
+installdirs-ps:
+ $(mkdir_p) $(DESTDIR)$(psdir)
+
+uninstall-ps:
+ $(RM) $(DESTDIR)$(psdir)/libunistring.ps
+
+
+# Documentation in Portable Document Format.
+
+# Override of automake's definition:
+#TEXI2PDF = @TEXI2DVI@ --pdf
+TEXI2PDF = @TEXI2DVI@ --pdf $(TEXINCLUDES)
+
+# The install-pdf target is already defined by automake.
+
+installdirs-pdf:
+ $(mkdir_p) $(DESTDIR)$(pdfdir)
+
+uninstall-pdf:
+ $(RM) $(DESTDIR)$(pdfdir)/libunistring.pdf
+
+
+# Documentation in HTML format.
+
+TEXI2HTML = @PERL@ $(top_srcdir)/build-aux/texi2html
+
+html-monolithic: libunistring.html
+html-split: libunistring_toc.html
+
+# Override of automake's definition.
+# We want to use texi2html, not makeinfo --html.
+libunistring.html: libunistring.texi version.texi $(libunistring_TEXINFOS)
+ $(TEXI2HTML) $(TEXINCLUDES) -no-sec-nav -no-menu -toc-links -number -monolithic `if test -f libunistring.texi; then echo libunistring.texi; else echo $(srcdir)/libunistring.texi; fi`
+
+libunistring_toc.html: libunistring.texi version.texi $(libunistring_TEXINFOS)
+ case "@PERL@" in \
+ *"/missing perl") \
+ $(TEXI2HTML) $(TEXINCLUDES) -no-sec-nav -no-menu -toc-links -number -split_chapter `if test -f libunistring.texi; then echo libunistring.texi; else echo $(srcdir)/libunistring.texi; fi` || exit 0 ;; \
+ *) $(RM) libunistring_*.html ; \
+ $(TEXI2HTML) $(TEXINCLUDES) -no-sec-nav -no-menu -toc-links -number -split_chapter `if test -f libunistring.texi; then echo libunistring.texi; else echo $(srcdir)/libunistring.texi; fi` ;; \
+ esac \
+ && { mv libunistring/libunistring.html libunistring_toc.html; \
+ mv libunistring/*.html .; \
+ rmdir libunistring; \
+ }
+
+install-html-monolithic: libunistring.html
+ $(mkdir_p) $(DESTDIR)$(htmldir)
+ $(INSTALL_DATA) `if test -f libunistring.html; then echo .; else echo $(srcdir); fi`/libunistring.html $(DESTDIR)$(htmldir)/libunistring.html
+
+install-html-split: libunistring_toc.html
+ $(mkdir_p) $(DESTDIR)$(htmldir)
+ for file in `if test -f libunistring_toc.html; then echo .; else echo $(srcdir); fi`/libunistring_*.html; do \
+ $(INSTALL_DATA) $$file $(DESTDIR)$(htmldir)/`basename $$file`; \
+ done
+
+installdirs-html:
+ $(mkdir_p) $(DESTDIR)$(htmldir)
+
+uninstall-html-monolithic:
+ $(RM) $(DESTDIR)$(htmldir)/libunistring.html
+
+uninstall-html-split:
+ $(RM) $(DESTDIR)$(htmldir)/libunistring_*.html
+
+dist-html-monolithic:
+ $(mkdir_p) $(distdir)/
+ file=libunistring.html; \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ cp -p $$d/$$file $(distdir)/$$file || exit 1
+
+# We would like to put libunistring_*.html into EXTRA_DIST, but it doesn't work.
+dist-html-split:
+ $(mkdir_p) $(distdir)/
+ file=libunistring_toc.html; \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ for file in `cd $$d && echo libunistring_*.html`; do \
+ cp -p $$d/$$file $(distdir)/$$file || exit 1; \
+ done
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644
index 00000000..66a4a3bc
--- /dev/null
+++ b/doc/Makefile.in
@@ -0,0 +1,1207 @@
+# Makefile.in generated by automake 1.11 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = doc
+DIST_COMMON = $(libunistring_TEXINFOS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/stamp-vti \
+ $(srcdir)/version.texi
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/gnulib-m4/00gnulib.m4 \
+ $(top_srcdir)/gnulib-m4/alloca.m4 \
+ $(top_srcdir)/gnulib-m4/codeset.m4 \
+ $(top_srcdir)/gnulib-m4/eealloc.m4 \
+ $(top_srcdir)/gnulib-m4/environ.m4 \
+ $(top_srcdir)/gnulib-m4/errno_h.m4 \
+ $(top_srcdir)/gnulib-m4/error.m4 \
+ $(top_srcdir)/gnulib-m4/exitfail.m4 \
+ $(top_srcdir)/gnulib-m4/exponentd.m4 \
+ $(top_srcdir)/gnulib-m4/exponentf.m4 \
+ $(top_srcdir)/gnulib-m4/exponentl.m4 \
+ $(top_srcdir)/gnulib-m4/extensions.m4 \
+ $(top_srcdir)/gnulib-m4/float_h.m4 \
+ $(top_srcdir)/gnulib-m4/fpieee.m4 \
+ $(top_srcdir)/gnulib-m4/frexp.m4 \
+ $(top_srcdir)/gnulib-m4/frexpl.m4 \
+ $(top_srcdir)/gnulib-m4/getpagesize.m4 \
+ $(top_srcdir)/gnulib-m4/glibc21.m4 \
+ $(top_srcdir)/gnulib-m4/gnulib-common.m4 \
+ $(top_srcdir)/gnulib-m4/gnulib-comp.m4 \
+ $(top_srcdir)/gnulib-m4/iconv.m4 \
+ $(top_srcdir)/gnulib-m4/iconv_h.m4 \
+ $(top_srcdir)/gnulib-m4/iconv_open.m4 \
+ $(top_srcdir)/gnulib-m4/include_next.m4 \
+ $(top_srcdir)/gnulib-m4/inline.m4 \
+ $(top_srcdir)/gnulib-m4/intlmacosx.m4 \
+ $(top_srcdir)/gnulib-m4/intmax_t.m4 \
+ $(top_srcdir)/gnulib-m4/inttypes_h.m4 \
+ $(top_srcdir)/gnulib-m4/isnand.m4 \
+ $(top_srcdir)/gnulib-m4/isnanf.m4 \
+ $(top_srcdir)/gnulib-m4/isnanl.m4 \
+ $(top_srcdir)/gnulib-m4/lcmessage.m4 \
+ $(top_srcdir)/gnulib-m4/ldexpl.m4 \
+ $(top_srcdir)/gnulib-m4/lib-ld.m4 \
+ $(top_srcdir)/gnulib-m4/lib-link.m4 \
+ $(top_srcdir)/gnulib-m4/lib-prefix.m4 \
+ $(top_srcdir)/gnulib-m4/localcharset.m4 \
+ $(top_srcdir)/gnulib-m4/locale-fr.m4 \
+ $(top_srcdir)/gnulib-m4/locale-ja.m4 \
+ $(top_srcdir)/gnulib-m4/locale-tr.m4 \
+ $(top_srcdir)/gnulib-m4/locale-zh.m4 \
+ $(top_srcdir)/gnulib-m4/locale_h.m4 \
+ $(top_srcdir)/gnulib-m4/localename.m4 \
+ $(top_srcdir)/gnulib-m4/longlong.m4 \
+ $(top_srcdir)/gnulib-m4/malloc.m4 \
+ $(top_srcdir)/gnulib-m4/malloca.m4 \
+ $(top_srcdir)/gnulib-m4/math_h.m4 \
+ $(top_srcdir)/gnulib-m4/mbchar.m4 \
+ $(top_srcdir)/gnulib-m4/mbiter.m4 \
+ $(top_srcdir)/gnulib-m4/mbrtowc.m4 \
+ $(top_srcdir)/gnulib-m4/mbsinit.m4 \
+ $(top_srcdir)/gnulib-m4/mbstate_t.m4 \
+ $(top_srcdir)/gnulib-m4/memchr.m4 \
+ $(top_srcdir)/gnulib-m4/minmax.m4 \
+ $(top_srcdir)/gnulib-m4/mmap-anon.m4 \
+ $(top_srcdir)/gnulib-m4/multiarch.m4 \
+ $(top_srcdir)/gnulib-m4/nocrash.m4 \
+ $(top_srcdir)/gnulib-m4/printf-frexp.m4 \
+ $(top_srcdir)/gnulib-m4/printf-frexpl.m4 \
+ $(top_srcdir)/gnulib-m4/printf.m4 \
+ $(top_srcdir)/gnulib-m4/relocatable-lib.m4 \
+ $(top_srcdir)/gnulib-m4/setenv.m4 \
+ $(top_srcdir)/gnulib-m4/signbit.m4 \
+ $(top_srcdir)/gnulib-m4/size_max.m4 \
+ $(top_srcdir)/gnulib-m4/stdbool.m4 \
+ $(top_srcdir)/gnulib-m4/stdint.m4 \
+ $(top_srcdir)/gnulib-m4/stdint_h.m4 \
+ $(top_srcdir)/gnulib-m4/stdlib_h.m4 \
+ $(top_srcdir)/gnulib-m4/strerror.m4 \
+ $(top_srcdir)/gnulib-m4/string_h.m4 \
+ $(top_srcdir)/gnulib-m4/unistd_h.m4 \
+ $(top_srcdir)/gnulib-m4/vasnprintf.m4 \
+ $(top_srcdir)/gnulib-m4/wchar.m4 \
+ $(top_srcdir)/gnulib-m4/wchar_t.m4 \
+ $(top_srcdir)/gnulib-m4/wctob.m4 \
+ $(top_srcdir)/gnulib-m4/wctype.m4 \
+ $(top_srcdir)/gnulib-m4/wcwidth.m4 \
+ $(top_srcdir)/gnulib-m4/wint_t.m4 \
+ $(top_srcdir)/gnulib-m4/xalloc.m4 \
+ $(top_srcdir)/gnulib-m4/xsize.m4 $(top_srcdir)/m4/exported.m4 \
+ $(top_srcdir)/m4/init-package-version.m4 \
+ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/woe32-dll.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+INFO_DEPS = $(srcdir)/libunistring.info
+TEXINFO_TEX = $(top_srcdir)/build-aux/texinfo.tex
+am__TEXINFO_TEX_DIR = $(top_srcdir)/build-aux
+DVIS = libunistring.dvi
+PDFS = libunistring.pdf
+PSS = libunistring.ps
+HTMLS = libunistring.html
+TEXINFOS = libunistring.texi
+MAKEINFOHTML = $(MAKEINFO) --html
+AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
+am__installdirs = "$(DESTDIR)$(infodir)"
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@
+BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@
+BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@
+BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@
+BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DLL_VARIABLE = @DLL_VARIABLE@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+
+# Documentation in Postscript format.
+
+# Override of automake's definition:
+#DVIPS = @DVIPS@
+DVIPS = @DVIPS@ -D600
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@
+EMULTIHOP_VALUE = @EMULTIHOP_VALUE@
+ENOLINK_HIDDEN = @ENOLINK_HIDDEN@
+ENOLINK_VALUE = @ENOLINK_VALUE@
+EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@
+EOVERFLOW_VALUE = @EOVERFLOW_VALUE@
+ERRNO_H = @ERRNO_H@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FLOAT_H = @FLOAT_H@
+GLIBC21 = @GLIBC21@
+GLOBAL_SYMBOL_PIPE = @GLOBAL_SYMBOL_PIPE@
+GNULIB_ATOLL = @GNULIB_ATOLL@
+GNULIB_BTOWC = @GNULIB_BTOWC@
+GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@
+GNULIB_CEILF = @GNULIB_CEILF@
+GNULIB_CEILL = @GNULIB_CEILL@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_CLOSE = @GNULIB_CLOSE@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_ENVIRON = @GNULIB_ENVIRON@
+GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FLOORF = @GNULIB_FLOORF@
+GNULIB_FLOORL = @GNULIB_FLOORL@
+GNULIB_FREXP = @GNULIB_FREXP@
+GNULIB_FREXPL = @GNULIB_FREXPL@
+GNULIB_FSYNC = @GNULIB_FSYNC@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@
+GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@
+GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@
+GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@
+GNULIB_ISFINITE = @GNULIB_ISFINITE@
+GNULIB_ISINF = @GNULIB_ISINF@
+GNULIB_ISNAN = @GNULIB_ISNAN@
+GNULIB_ISNAND = @GNULIB_ISNAND@
+GNULIB_ISNANF = @GNULIB_ISNANF@
+GNULIB_ISNANL = @GNULIB_ISNANL@
+GNULIB_LCHOWN = @GNULIB_LCHOWN@
+GNULIB_LDEXPL = @GNULIB_LDEXPL@
+GNULIB_LINK = @GNULIB_LINK@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@
+GNULIB_MATHL = @GNULIB_MATHL@
+GNULIB_MBRLEN = @GNULIB_MBRLEN@
+GNULIB_MBRTOWC = @GNULIB_MBRTOWC@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSINIT = @GNULIB_MBSINIT@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSNLEN = @GNULIB_MBSNLEN@
+GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MEMCHR = @GNULIB_MEMCHR@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_PUTENV = @GNULIB_PUTENV@
+GNULIB_RANDOM_R = @GNULIB_RANDOM_R@
+GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@
+GNULIB_ROUND = @GNULIB_ROUND@
+GNULIB_ROUNDF = @GNULIB_ROUNDF@
+GNULIB_ROUNDL = @GNULIB_ROUNDL@
+GNULIB_RPMATCH = @GNULIB_RPMATCH@
+GNULIB_SETENV = @GNULIB_SETENV@
+GNULIB_SIGNBIT = @GNULIB_SIGNBIT@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRERROR = @GNULIB_STRERROR@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@
+GNULIB_STRSTR = @GNULIB_STRSTR@
+GNULIB_STRTOD = @GNULIB_STRTOD@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOLL = @GNULIB_STRTOLL@
+GNULIB_STRTOULL = @GNULIB_STRTOULL@
+GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@
+GNULIB_TRUNC = @GNULIB_TRUNC@
+GNULIB_TRUNCF = @GNULIB_TRUNCF@
+GNULIB_TRUNCL = @GNULIB_TRUNCL@
+GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@
+GNULIB_UNSETENV = @GNULIB_UNSETENV@
+GNULIB_WCRTOMB = @GNULIB_WCRTOMB@
+GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@
+GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@
+GNULIB_WCTOB = @GNULIB_WCTOB@
+GNULIB_WCWIDTH = @GNULIB_WCWIDTH@
+GNULIB_WRITE = @GNULIB_WRITE@
+GREP = @GREP@
+HAVE_ATOLL = @HAVE_ATOLL@
+HAVE_BTOWC = @HAVE_BTOWC@
+HAVE_CALLOC_POSIX = @HAVE_CALLOC_POSIX@
+HAVE_DECL_ACOSL = @HAVE_DECL_ACOSL@
+HAVE_DECL_ASINL = @HAVE_DECL_ASINL@
+HAVE_DECL_ATANL = @HAVE_DECL_ATANL@
+HAVE_DECL_COSL = @HAVE_DECL_COSL@
+HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@
+HAVE_DECL_EXPL = @HAVE_DECL_EXPL@
+HAVE_DECL_FREXPL = @HAVE_DECL_FREXPL@
+HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_LDEXPL = @HAVE_DECL_LDEXPL@
+HAVE_DECL_LOGL = @HAVE_DECL_LOGL@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_SINL = @HAVE_DECL_SINL@
+HAVE_DECL_SQRTL = @HAVE_DECL_SQRTL@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRERROR = @HAVE_DECL_STRERROR@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_TANL = @HAVE_DECL_TANL@
+HAVE_DECL_TRUNC = @HAVE_DECL_TRUNC@
+HAVE_DECL_TRUNCF = @HAVE_DECL_TRUNCF@
+HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@
+HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@
+HAVE_DUP2 = @HAVE_DUP2@
+HAVE_EUIDACCESS = @HAVE_EUIDACCESS@
+HAVE_FSYNC = @HAVE_FSYNC@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_GETDOMAINNAME = @HAVE_GETDOMAINNAME@
+HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@
+HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@
+HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_GETUSERSHELL = @HAVE_GETUSERSHELL@
+HAVE_GLOBAL_SYMBOL_PIPE = @HAVE_GLOBAL_SYMBOL_PIPE@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_ISNAND = @HAVE_ISNAND@
+HAVE_ISNANF = @HAVE_ISNANF@
+HAVE_ISNANL = @HAVE_ISNANL@
+HAVE_ISWCNTRL = @HAVE_ISWCNTRL@
+HAVE_LINK = @HAVE_LINK@
+HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@
+HAVE_MALLOC_POSIX = @HAVE_MALLOC_POSIX@
+HAVE_MBRLEN = @HAVE_MBRLEN@
+HAVE_MBRTOWC = @HAVE_MBRTOWC@
+HAVE_MBSINIT = @HAVE_MBSINIT@
+HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@
+HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_OS_H = @HAVE_OS_H@
+HAVE_RANDOM_H = @HAVE_RANDOM_H@
+HAVE_RANDOM_R = @HAVE_RANDOM_R@
+HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@
+HAVE_READLINK = @HAVE_READLINK@
+HAVE_REALLOC_POSIX = @HAVE_REALLOC_POSIX@
+HAVE_RPMATCH = @HAVE_RPMATCH@
+HAVE_SETENV = @HAVE_SETENV@
+HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@
+HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@
+HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@
+HAVE_SLEEP = @HAVE_SLEEP@
+HAVE_STDINT_H = @HAVE_STDINT_H@
+HAVE_STPCPY = @HAVE_STPCPY@
+HAVE_STPNCPY = @HAVE_STPNCPY@
+HAVE_STRCASESTR = @HAVE_STRCASESTR@
+HAVE_STRCHRNUL = @HAVE_STRCHRNUL@
+HAVE_STRNDUP = @HAVE_STRNDUP@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRTOD = @HAVE_STRTOD@
+HAVE_STRTOLL = @HAVE_STRTOLL@
+HAVE_STRTOULL = @HAVE_STRTOULL@
+HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@
+HAVE_STRVERSCMP = @HAVE_STRVERSCMP@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@
+HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNSETENV = @HAVE_UNSETENV@
+HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@
+HAVE_WCHAR_H = @HAVE_WCHAR_H@
+HAVE_WCRTOMB = @HAVE_WCRTOMB@
+HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@
+HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@
+HAVE_WCTYPE_H = @HAVE_WCTYPE_H@
+HAVE_WINT_T = @HAVE_WINT_T@
+HAVE__BOOL = @HAVE__BOOL@
+HEXVERSION = @HEXVERSION@
+ICONV_H = @ICONV_H@
+INCLUDE_NEXT = @INCLUDE_NEXT@
+INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTESTS_LIBDEPS = @LIBTESTS_LIBDEPS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@
+LOCALE_FR = @LOCALE_FR@
+LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@
+LOCALE_H = @LOCALE_H@
+LOCALE_JA = @LOCALE_JA@
+LOCALE_TR_UTF8 = @LOCALE_TR_UTF8@
+LOCALE_ZH_CN = @LOCALE_ZH_CN@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = env LANG= LC_MESSAGES= LC_ALL= LANGUAGE= @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+NAMESPACING = @NAMESPACING@
+NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@
+NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@
+NEXT_AS_FIRST_DIRECTIVE_ICONV_H = @NEXT_AS_FIRST_DIRECTIVE_ICONV_H@
+NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@
+NEXT_AS_FIRST_DIRECTIVE_MATH_H = @NEXT_AS_FIRST_DIRECTIVE_MATH_H@
+NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@
+NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@
+NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@
+NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@
+NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@
+NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@
+NEXT_ERRNO_H = @NEXT_ERRNO_H@
+NEXT_FLOAT_H = @NEXT_FLOAT_H@
+NEXT_ICONV_H = @NEXT_ICONV_H@
+NEXT_LOCALE_H = @NEXT_LOCALE_H@
+NEXT_MATH_H = @NEXT_MATH_H@
+NEXT_STDINT_H = @NEXT_STDINT_H@
+NEXT_STDLIB_H = @NEXT_STDLIB_H@
+NEXT_STRING_H = @NEXT_STRING_H@
+NEXT_UNISTD_H = @NEXT_UNISTD_H@
+NEXT_WCHAR_H = @NEXT_WCHAR_H@
+NEXT_WCTYPE_H = @NEXT_WCTYPE_H@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+RANLIB = @RANLIB@
+RC = @RC@
+RELOCATABLE = @RELOCATABLE@
+REPLACE_BTOWC = @REPLACE_BTOWC@
+REPLACE_CEILF = @REPLACE_CEILF@
+REPLACE_CEILL = @REPLACE_CEILL@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_CLOSE = @REPLACE_CLOSE@
+REPLACE_FCHDIR = @REPLACE_FCHDIR@
+REPLACE_FLOORF = @REPLACE_FLOORF@
+REPLACE_FLOORL = @REPLACE_FLOORL@
+REPLACE_FREXP = @REPLACE_FREXP@
+REPLACE_FREXPL = @REPLACE_FREXPL@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@
+REPLACE_HUGE_VAL = @REPLACE_HUGE_VAL@
+REPLACE_ICONV = @REPLACE_ICONV@
+REPLACE_ICONV_OPEN = @REPLACE_ICONV_OPEN@
+REPLACE_ICONV_UTF = @REPLACE_ICONV_UTF@
+REPLACE_ISFINITE = @REPLACE_ISFINITE@
+REPLACE_ISINF = @REPLACE_ISINF@
+REPLACE_ISNAN = @REPLACE_ISNAN@
+REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@
+REPLACE_LCHOWN = @REPLACE_LCHOWN@
+REPLACE_LDEXPL = @REPLACE_LDEXPL@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_MBRLEN = @REPLACE_MBRLEN@
+REPLACE_MBRTOWC = @REPLACE_MBRTOWC@
+REPLACE_MBSINIT = @REPLACE_MBSINIT@
+REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@
+REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@
+REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@
+REPLACE_MEMCHR = @REPLACE_MEMCHR@
+REPLACE_MEMMEM = @REPLACE_MEMMEM@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_NAN = @REPLACE_NAN@
+REPLACE_PUTENV = @REPLACE_PUTENV@
+REPLACE_ROUND = @REPLACE_ROUND@
+REPLACE_ROUNDF = @REPLACE_ROUNDF@
+REPLACE_ROUNDL = @REPLACE_ROUNDL@
+REPLACE_SIGNBIT = @REPLACE_SIGNBIT@
+REPLACE_SIGNBIT_USING_GCC = @REPLACE_SIGNBIT_USING_GCC@
+REPLACE_STRCASESTR = @REPLACE_STRCASESTR@
+REPLACE_STRDUP = @REPLACE_STRDUP@
+REPLACE_STRERROR = @REPLACE_STRERROR@
+REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@
+REPLACE_STRSTR = @REPLACE_STRSTR@
+REPLACE_STRTOD = @REPLACE_STRTOD@
+REPLACE_TRUNCL = @REPLACE_TRUNCL@
+REPLACE_WCRTOMB = @REPLACE_WCRTOMB@
+REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@
+REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@
+REPLACE_WCTOB = @REPLACE_WCTOB@
+REPLACE_WCWIDTH = @REPLACE_WCWIDTH@
+REPLACE_WRITE = @REPLACE_WRITE@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDBOOL_H = @STDBOOL_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+
+# Documentation in DVI format.
+
+# Override of automake's definition:
+#TEXI2DVI = @TEXI2DVI@
+TEXI2DVI = @TEXI2DVI@ $(TEXINCLUDES)
+UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@
+VERSION = @VERSION@
+VOID_UNSETENV = @VOID_UNSETENV@
+WCHAR_H = @WCHAR_H@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WCTYPE_H = @WCTYPE_H@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+gl_LIBOBJS = @gl_LIBOBJS@
+gl_LTLIBOBJS = @gl_LTLIBOBJS@
+gltests_LIBOBJS = @gltests_LIBOBJS@
+gltests_LTLIBOBJS = @gltests_LTLIBOBJS@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = 1.5 gnits
+EXTRA_DIST =
+MOSTLYCLEANFILES =
+
+# List of -I options referring to directories that contain texinfo sources
+# used by this directory.
+# Should contain at least one -I option, to work around a bug in texi2dvi 1.13,
+# see <http://lists.gnu.org/archive/html/bug-automake/2009-04/msg00029.html>.
+TEXINCLUDES = -I .
+MAKEINFOFLAGS = $(TEXINCLUDES) --no-split
+info_TEXINFOS = libunistring.texi
+# List of texinfo sources @included by libunistring.texi, excluding version.texi.
+libunistring_TEXINFOS = \
+ unitypes.texi unistr.texi uniconv.texi unistdio.texi uniname.texi \
+ unictype.texi uniwidth.texi uniwbrk.texi unilbrk.texi uninorm.texi \
+ unicase.texi uniregex.texi \
+ gpl.texi lgpl.texi fdl.texi
+
+
+# CLEANFILES: libunistring.{dvi,ps,pdf,html} are already known to automake.
+MAINTAINERCLEANFILES = libunistring_*.html
+
+# Documentation in Portable Document Format.
+
+# Override of automake's definition:
+#TEXI2PDF = @TEXI2DVI@ --pdf
+TEXI2PDF = @TEXI2DVI@ --pdf $(TEXINCLUDES)
+
+# Documentation in HTML format.
+TEXI2HTML = @PERL@ $(top_srcdir)/build-aux/texi2html
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .dvi .html .info .pdf .ps .texi
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits doc/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnits doc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+.texi.info:
+ restore=: && backupdir="$(am__leading_dot)am$$$$" && \
+ am__cwd=`pwd` && $(am__cd) $(srcdir) && \
+ rm -rf $$backupdir && mkdir $$backupdir && \
+ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \
+ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
+ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
+ done; \
+ else :; fi && \
+ cd "$$am__cwd"; \
+ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $@ $<; \
+ then \
+ rc=0; \
+ $(am__cd) $(srcdir); \
+ else \
+ rc=$$?; \
+ $(am__cd) $(srcdir) && \
+ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
+ fi; \
+ rm -rf $$backupdir; exit $$rc
+
+.texi.dvi:
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2DVI) $<
+
+.texi.pdf:
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2PDF) $<
+
+.texi.html:
+ rm -rf $(@:.html=.htp)
+ if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $(@:.html=.htp) $<; \
+ then \
+ rm -rf $@; \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
+ else \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
+ exit 1; \
+ fi
+$(srcdir)/libunistring.info: libunistring.texi $(srcdir)/version.texi $(libunistring_TEXINFOS)
+libunistring.dvi: libunistring.texi $(srcdir)/version.texi $(libunistring_TEXINFOS)
+libunistring.pdf: libunistring.texi $(srcdir)/version.texi $(libunistring_TEXINFOS)
+$(srcdir)/version.texi: $(srcdir)/stamp-vti
+
+mostlyclean-vti:
+ -rm -f vti.tmp
+
+maintainer-clean-vti:
+ -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi
+.dvi.ps:
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ $(DVIPS) -o $@ $<
+
+uninstall-dvi-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(DVIS)'; test -n "$(dvidir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \
+ rm -f "$(DESTDIR)$(dvidir)/$$f"; \
+ done
+
+uninstall-html-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \
+ rm -rf "$(DESTDIR)$(htmldir)/$$f"; \
+ done
+
+uninstall-info-am:
+ @$(PRE_UNINSTALL)
+ @if test -d '$(DESTDIR)$(infodir)' && \
+ (install-info --version && \
+ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
+ if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
+ then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \
+ done; \
+ else :; fi
+ @$(NORMAL_UNINSTALL)
+ @list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
+ (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \
+ echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \
+ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
+ else :; fi); \
+ done
+
+uninstall-pdf-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pdfdir)/$$f"; \
+ done
+
+uninstall-ps-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(PSS)'; test -n "$(psdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(psdir)/$$f"; \
+ done
+
+dist-info: $(INFO_DEPS)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ list='$(INFO_DEPS)'; \
+ for base in $$list; do \
+ case $$base in \
+ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
+ esac; \
+ if test -f $$base; then d=.; else d=$(srcdir); fi; \
+ base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \
+ for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \
+ if test -f $$file; then \
+ relfile=`expr "$$file" : "$$d/\(.*\)"`; \
+ test -f "$(distdir)/$$relfile" || \
+ cp -p $$file "$(distdir)/$$relfile"; \
+ else :; fi; \
+ done; \
+ done
+
+mostlyclean-aminfo:
+ -rm -rf libunistring.am libunistring.aux libunistring.cp libunistring.cps \
+ libunistring.fn libunistring.ky libunistring.kys \
+ libunistring.log libunistring.pg libunistring.pgs \
+ libunistring.tmp libunistring.toc libunistring.tp \
+ libunistring.vr libunistring.vrs
+
+clean-aminfo:
+ -test -z "libunistring.dvi libunistring.pdf libunistring.ps libunistring.html" \
+ || rm -rf libunistring.dvi libunistring.pdf libunistring.ps libunistring.html
+
+maintainer-clean-aminfo:
+ @list='$(INFO_DEPS)'; for i in $$list; do \
+ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
+ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
+ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
+ done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-info dist-hook
+check-am: all-am
+check: check-am
+all-am: Makefile $(INFO_DEPS) all-local
+installdirs: installdirs-local
+ for dir in "$(DESTDIR)$(infodir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-aminfo clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am: $(DVIS)
+
+html: html-am
+
+html-am: $(HTMLS) html-local
+
+info: info-am
+
+info-am: $(INFO_DEPS)
+
+install-data-am: install-data-local install-info-am
+
+install-dvi: install-dvi-am
+
+install-dvi-am: $(DVIS)
+ @$(NORMAL_INSTALL)
+ test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)"
+ @list='$(DVIS)'; test -n "$(dvidir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \
+ done
+install-exec-am:
+
+install-html-am: $(HTMLS)
+ @$(NORMAL_INSTALL)
+ test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)"
+ @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ $(am__strip_dir) \
+ if test -d "$$d$$p"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \
+ $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
+ echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \
+ $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \
+ else \
+ list2="$$list2 $$d$$p"; \
+ fi; \
+ done; \
+ test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \
+ done; }
+install-info: install-info-am
+
+install-info-am: $(INFO_DEPS)
+ @$(NORMAL_INSTALL)
+ test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)"
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
+ for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ esac; \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
+ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
+ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
+ if test -f $$ifile; then \
+ echo "$$ifile"; \
+ else : ; fi; \
+ done; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done
+ @$(POST_INSTALL)
+ @if (install-info --version && \
+ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
+ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
+ done; \
+ else : ; fi
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am: $(PDFS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)"
+ @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done
+install-ps: install-ps-am
+
+install-ps-am: $(PSS)
+ @$(NORMAL_INSTALL)
+ test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)"
+ @list='$(PSS)'; test -n "$(psdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-aminfo \
+ maintainer-clean-generic maintainer-clean-vti
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-aminfo mostlyclean-generic \
+ mostlyclean-libtool mostlyclean-vti
+
+pdf: pdf-am
+
+pdf-am: $(PDFS)
+
+ps: ps-am
+
+ps-am: $(PSS)
+
+uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \
+ uninstall-local uninstall-pdf-am uninstall-ps-am
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am all-local check check-am clean clean-aminfo \
+ clean-generic clean-libtool dist-hook dist-info distclean \
+ distclean-generic distclean-libtool distdir dvi dvi-am html \
+ html-am html-local info info-am install install-am \
+ install-data install-data-am install-data-local install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-local maintainer-clean maintainer-clean-aminfo \
+ maintainer-clean-generic maintainer-clean-vti mostlyclean \
+ mostlyclean-aminfo mostlyclean-generic mostlyclean-libtool \
+ mostlyclean-vti pdf pdf-am ps ps-am uninstall uninstall-am \
+ uninstall-dvi-am uninstall-html-am uninstall-info-am \
+ uninstall-local uninstall-pdf-am uninstall-ps-am
+
+
+# The dependencies of stamp-vti generated by automake are incomplete.
+# So we have to duplicate the entire rule which would otherwise be generated
+# by automake.
+$(srcdir)/stamp-vti: $(info_TEXINFOS) $(libunistring_TEXINFOS) $(top_srcdir)/version.sh
+ (dir=.; test -f ./libunistring.texi || dir=$(srcdir); \
+ set `$(SHELL) $(top_srcdir)/build-aux/mdate-sh $$dir/libunistring.texi`; \
+ echo "@set UPDATED $$1 $$2 $$3"; \
+ echo "@set UPDATED-MONTH $$2 $$3"; \
+ echo "@set EDITION $(VERSION)"; \
+ echo "@set VERSION $(VERSION)") > vti.tmp
+ cmp -s vti.tmp $(srcdir)/version.texi \
+ || (echo "Updating $(srcdir)/version.texi"; \
+ cp vti.tmp $(srcdir)/version.texi)
+ rm -f vti.tmp
+ cp $(srcdir)/version.texi $@
+
+# We distribute only the split HTML documentation.
+# The user can generate the others, via
+# make libunistring.ps
+# make libunistring.pdf
+# make libunistring.html
+
+all-local: html-local
+install-data-local: install-html
+installdirs-local: installdirs-html
+uninstall-local: uninstall-html
+dist-hook: dist-html
+
+html-local: html-split
+# Override of automake's definition. The HTML files we want to distribute are
+# not the ones that automake knows about, and we cannot define HTMLS to a value
+# containing wildcards.
+install-html: install-html-split
+ @:
+uninstall-html: uninstall-html-split
+dist-html: dist-html-split
+
+# The install-dvi target is already defined by automake.
+
+installdirs-dvi:
+ $(mkdir_p) $(DESTDIR)$(dvidir)
+
+uninstall-dvi:
+ $(RM) $(DESTDIR)$(dvidir)/libunistring.dvi
+
+libunistring.ps: libunistring.dvi
+ $(DVIPS) -o $@ `if test -f libunistring.dvi; then echo libunistring.dvi; else echo $(srcdir)/libunistring.dvi; fi`
+
+# The install-ps target is already defined by automake.
+
+installdirs-ps:
+ $(mkdir_p) $(DESTDIR)$(psdir)
+
+uninstall-ps:
+ $(RM) $(DESTDIR)$(psdir)/libunistring.ps
+
+# The install-pdf target is already defined by automake.
+
+installdirs-pdf:
+ $(mkdir_p) $(DESTDIR)$(pdfdir)
+
+uninstall-pdf:
+ $(RM) $(DESTDIR)$(pdfdir)/libunistring.pdf
+
+html-monolithic: libunistring.html
+html-split: libunistring_toc.html
+
+# Override of automake's definition.
+# We want to use texi2html, not makeinfo --html.
+libunistring.html: libunistring.texi version.texi $(libunistring_TEXINFOS)
+ $(TEXI2HTML) $(TEXINCLUDES) -no-sec-nav -no-menu -toc-links -number -monolithic `if test -f libunistring.texi; then echo libunistring.texi; else echo $(srcdir)/libunistring.texi; fi`
+
+libunistring_toc.html: libunistring.texi version.texi $(libunistring_TEXINFOS)
+ case "@PERL@" in \
+ *"/missing perl") \
+ $(TEXI2HTML) $(TEXINCLUDES) -no-sec-nav -no-menu -toc-links -number -split_chapter `if test -f libunistring.texi; then echo libunistring.texi; else echo $(srcdir)/libunistring.texi; fi` || exit 0 ;; \
+ *) $(RM) libunistring_*.html ; \
+ $(TEXI2HTML) $(TEXINCLUDES) -no-sec-nav -no-menu -toc-links -number -split_chapter `if test -f libunistring.texi; then echo libunistring.texi; else echo $(srcdir)/libunistring.texi; fi` ;; \
+ esac \
+ && { mv libunistring/libunistring.html libunistring_toc.html; \
+ mv libunistring/*.html .; \
+ rmdir libunistring; \
+ }
+
+install-html-monolithic: libunistring.html
+ $(mkdir_p) $(DESTDIR)$(htmldir)
+ $(INSTALL_DATA) `if test -f libunistring.html; then echo .; else echo $(srcdir); fi`/libunistring.html $(DESTDIR)$(htmldir)/libunistring.html
+
+install-html-split: libunistring_toc.html
+ $(mkdir_p) $(DESTDIR)$(htmldir)
+ for file in `if test -f libunistring_toc.html; then echo .; else echo $(srcdir); fi`/libunistring_*.html; do \
+ $(INSTALL_DATA) $$file $(DESTDIR)$(htmldir)/`basename $$file`; \
+ done
+
+installdirs-html:
+ $(mkdir_p) $(DESTDIR)$(htmldir)
+
+uninstall-html-monolithic:
+ $(RM) $(DESTDIR)$(htmldir)/libunistring.html
+
+uninstall-html-split:
+ $(RM) $(DESTDIR)$(htmldir)/libunistring_*.html
+
+dist-html-monolithic:
+ $(mkdir_p) $(distdir)/
+ file=libunistring.html; \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ cp -p $$d/$$file $(distdir)/$$file || exit 1
+
+# We would like to put libunistring_*.html into EXTRA_DIST, but it doesn't work.
+dist-html-split:
+ $(mkdir_p) $(distdir)/
+ file=libunistring_toc.html; \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ for file in `cd $$d && echo libunistring_*.html`; do \
+ cp -p $$d/$$file $(distdir)/$$file || exit 1; \
+ done
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/doc/fdl.texi b/doc/fdl.texi
new file mode 100644
index 00000000..8805f1a4
--- /dev/null
+++ b/doc/fdl.texi
@@ -0,0 +1,506 @@
+@c The GNU Free Documentation License.
+@center Version 1.3, 3 November 2008
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+@uref{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The ``Document'', below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as ``you''. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject. (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+@sc{ascii} without markup, Texinfo input format, La@TeX{} input
+format, @acronym{SGML} or @acronym{XML} using a publicly available
+@acronym{DTD}, and standard-conforming simple @acronym{HTML},
+PostScript or @acronym{PDF} designed for human modification. Examples
+of transparent image formats include @acronym{PNG}, @acronym{XCF} and
+@acronym{JPG}. Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, @acronym{SGML} or
+@acronym{XML} for which the @acronym{DTD} and/or processing tools are
+not generally available, and the machine-generated @acronym{HTML},
+PostScript or @acronym{PDF} produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+The ``publisher'' means any person or entity that distributes copies
+of the Document to the public.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document). You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page. If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on. These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles. Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''. Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''. You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+@uref{http://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation. If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+
+@item
+RELICENSING
+
+``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server. A
+``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+
+``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+``Incorporate'' means to publish or republish a Document, in whole or
+in part, as part of another Document.
+
+An MMC is ``eligible for relicensing'' if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+
+@end enumerate
+
+@page
+@heading ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+ Copyright (C) @var{year} @var{your name}.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with@dots{}Texts.'' line with this:
+
+@smallexample
+@group
+ with the Invariant Sections being @var{list their titles}, with
+ the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+ being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@c Local Variables:
+@c ispell-local-pdict: "ispell-dict"
+@c End:
+
diff --git a/doc/gpl.texi b/doc/gpl.texi
new file mode 100644
index 00000000..97a17e19
--- /dev/null
+++ b/doc/gpl.texi
@@ -0,0 +1,717 @@
+@c The GNU General Public License.
+@center Version 3, 29 June 2007
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+@end display
+
+@heading Preamble
+
+The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom
+to share and change all versions of a program---to make sure it remains
+free software for all its users. We, the Free Software Foundation,
+use the GNU General Public License for most of our software; it
+applies also to any other work released this way by its authors. You
+can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you
+have certain responsibilities if you distribute copies of the
+software, or if you modify it: responsibilities to respect the freedom
+of others.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too,
+receive or can get the source code. And you must show them these
+terms so they know their rights.
+
+Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the
+manufacturer can do so. This is fundamentally incompatible with the
+aim of protecting users' freedom to change the software. The
+systematic pattern of such abuse occurs in the area of products for
+individuals to use, which is precisely where it is most unacceptable.
+Therefore, we have designed this version of the GPL to prohibit the
+practice for those products. If such problems arise substantially in
+other domains, we stand ready to extend this provision to those
+domains in future versions of the GPL, as needed to protect the
+freedom of users.
+
+Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish
+to avoid the special danger that patents applied to a free program
+could make it effectively proprietary. To prevent this, the GPL
+assures that patents cannot be used to render the program non-free.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+@heading TERMS AND CONDITIONS
+
+@enumerate 0
+@item Definitions.
+
+``This License'' refers to version 3 of the GNU General Public License.
+
+``Copyright'' also means copyright-like laws that apply to other kinds
+of works, such as semiconductor masks.
+
+``The Program'' refers to any copyrightable work licensed under this
+License. Each licensee is addressed as ``you''. ``Licensees'' and
+``recipients'' may be individuals or organizations.
+
+To ``modify'' a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of
+an exact copy. The resulting work is called a ``modified version'' of
+the earlier work or a work ``based on'' the earlier work.
+
+A ``covered work'' means either the unmodified Program or a work based
+on the Program.
+
+To ``propagate'' a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+To ``convey'' a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user
+through a computer network, with no transfer of a copy, is not
+conveying.
+
+An interactive user interface displays ``Appropriate Legal Notices'' to
+the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+@item Source Code.
+
+The ``source code'' for a work means the preferred form of the work for
+making modifications to it. ``Object code'' means any non-source form
+of a work.
+
+A ``Standard Interface'' means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+The ``System Libraries'' of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+``Major Component'', in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+The ``Corresponding Source'' for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users can
+regenerate automatically from other parts of the Corresponding Source.
+
+The Corresponding Source for a work in source code form is that same
+work.
+
+@item Basic Permissions.
+
+All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not convey,
+without conditions so long as your license otherwise remains in force.
+You may convey covered works to others for the sole purpose of having
+them make modifications exclusively for you, or provide you with
+facilities for running those works, provided that you comply with the
+terms of this License in conveying all material for which you do not
+control copyright. Those thus making or running the covered works for
+you must do so exclusively on your behalf, under your direction and
+control, on terms that prohibit them from making any copies of your
+copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under the
+conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+@item Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such
+circumvention is effected by exercising rights under this License with
+respect to the covered work, and you disclaim any intention to limit
+operation or modification of the work as a means of enforcing, against
+the work's users, your or third parties' legal rights to forbid
+circumvention of technological measures.
+
+@item Conveying Verbatim Copies.
+
+You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+@item Conveying Modified Source Versions.
+
+You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these
+conditions:
+
+@enumerate a
+@item
+The work must carry prominent notices stating that you modified it,
+and giving a relevant date.
+
+@item
+The work must carry prominent notices stating that it is released
+under this License and any conditions added under section 7. This
+requirement modifies the requirement in section 4 to ``keep intact all
+notices''.
+
+@item
+You must license the entire work, as a whole, under this License to
+anyone who comes into possession of a copy. This License will
+therefore apply, along with any applicable section 7 additional terms,
+to the whole of the work, and all its parts, regardless of how they
+are packaged. This License gives no permission to license the work in
+any other way, but it does not invalidate such permission if you have
+separately received it.
+
+@item
+If the work has interactive user interfaces, each must display
+Appropriate Legal Notices; however, if the Program has interactive
+interfaces that do not display Appropriate Legal Notices, your work
+need not make them do so.
+@end enumerate
+
+A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+``aggregate'' if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+@item Conveying Non-Source Forms.
+
+You may convey a covered work in object code form under the terms of
+sections 4 and 5, provided that you also convey the machine-readable
+Corresponding Source under the terms of this License, in one of these
+ways:
+
+@enumerate a
+@item
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by the
+Corresponding Source fixed on a durable physical medium customarily
+used for software interchange.
+
+@item
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by a written
+offer, valid for at least three years and valid for as long as you
+offer spare parts or customer support for that product model, to give
+anyone who possesses the object code either (1) a copy of the
+Corresponding Source for all the software in the product that is
+covered by this License, on a durable physical medium customarily used
+for software interchange, for a price no more than your reasonable
+cost of physically performing this conveying of source, or (2) access
+to copy the Corresponding Source from a network server at no charge.
+
+@item
+Convey individual copies of the object code with a copy of the written
+offer to provide the Corresponding Source. This alternative is
+allowed only occasionally and noncommercially, and only if you
+received the object code with such an offer, in accord with subsection
+6b.
+
+@item
+Convey the object code by offering access from a designated place
+(gratis or for a charge), and offer equivalent access to the
+Corresponding Source in the same way through the same place at no
+further charge. You need not require recipients to copy the
+Corresponding Source along with the object code. If the place to copy
+the object code is a network server, the Corresponding Source may be
+on a different server (operated by you or a third party) that supports
+equivalent copying facilities, provided you maintain clear directions
+next to the object code saying where to find the Corresponding Source.
+Regardless of what server hosts the Corresponding Source, you remain
+obligated to ensure that it is available for as long as needed to
+satisfy these requirements.
+
+@item
+Convey the object code using peer-to-peer transmission, provided you
+inform other peers where the object code and Corresponding Source of
+the work are being offered to the general public at no charge under
+subsection 6d.
+
+@end enumerate
+
+A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+A ``User Product'' is either (1) a ``consumer product'', which means any
+tangible personal property which is normally used for personal,
+family, or household purposes, or (2) anything designed or sold for
+incorporation into a dwelling. In determining whether a product is a
+consumer product, doubtful cases shall be resolved in favor of
+coverage. For a particular product received by a particular user,
+``normally used'' refers to a typical or common use of that class of
+product, regardless of the status of the particular user or of the way
+in which the particular user actually uses, or expects or is expected
+to use, the product. A product is a consumer product regardless of
+whether the product has substantial commercial, industrial or
+non-consumer uses, unless such uses represent the only significant
+mode of use of the product.
+
+``Installation Information'' for a User Product means any methods,
+procedures, authorization keys, or other information required to
+install and execute modified versions of a covered work in that User
+Product from a modified version of its Corresponding Source. The
+information must suffice to ensure that the continued functioning of
+the modified object code is in no case prevented or interfered with
+solely because modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or
+updates for a work that has been modified or installed by the
+recipient, or for the User Product in which it has been modified or
+installed. Access to a network may be denied when the modification
+itself materially and adversely affects the operation of the network
+or violates the rules and protocols for communication across the
+network.
+
+Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+@item Additional Terms.
+
+``Additional permissions'' are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders
+of that material) supplement the terms of this License with terms:
+
+@enumerate a
+@item
+Disclaiming warranty or limiting liability differently from the terms
+of sections 15 and 16 of this License; or
+
+@item
+Requiring preservation of specified reasonable legal notices or author
+attributions in that material or in the Appropriate Legal Notices
+displayed by works containing it; or
+
+@item
+Prohibiting misrepresentation of the origin of that material, or
+requiring that modified versions of such material be marked in
+reasonable ways as different from the original version; or
+
+@item
+Limiting the use for publicity purposes of names of licensors or
+authors of the material; or
+
+@item
+Declining to grant rights under trademark law for use of some trade
+names, trademarks, or service marks; or
+
+@item
+Requiring indemnification of licensors and authors of that material by
+anyone who conveys the material (or modified versions of it) with
+contractual assumptions of liability to the recipient, for any
+liability that these contractual assumptions directly impose on those
+licensors and authors.
+@end enumerate
+
+All other non-permissive additional terms are considered ``further
+restrictions'' within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions; the
+above requirements apply either way.
+
+@item Termination.
+
+You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+@item Acceptance Not Required for Having Copies.
+
+You are not required to accept this License in order to receive or run
+a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+@item Automatic Licensing of Downstream Recipients.
+
+Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+An ``entity transaction'' is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+@item Patents.
+
+A ``contributor'' is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's ``contributor version''.
+
+A contributor's ``essential patent claims'' are all patent claims owned
+or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, ``control'' includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+In the following three paragraphs, a ``patent license'' is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To ``grant'' such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. ``Knowingly relying'' means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+A patent license is ``discriminatory'' if it does not include within the
+scope of its coverage, prohibits the exercise of, or is conditioned on
+the non-exercise of one or more of the rights that are specifically
+granted under this License. You may not convey a covered work if you
+are a party to an arrangement with a third party that is in the
+business of distributing software, under which you make payment to the
+third party based on the extent of your activity of conveying the
+work, and under which the third party grants, to any of the parties
+who would receive the covered work from you, a discriminatory patent
+license (a) in connection with copies of the covered work conveyed by
+you (or copies made from those copies), or (b) primarily for and in
+connection with specific products or compilations that contain the
+covered work, unless you entered into that arrangement, or that patent
+license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+@item No Surrender of Others' Freedom.
+
+If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey
+a covered work so as to satisfy simultaneously your obligations under
+this License and any other pertinent obligations, then as a
+consequence you may not convey it at all. For example, if you agree
+to terms that obligate you to collect a royalty for further conveying
+from those to whom you convey the Program, the only way you could
+satisfy both those terms and this License would be to refrain entirely
+from conveying the Program.
+
+@item Use with the GNU Affero General Public License.
+
+Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+@item Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions
+of the GNU General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies that a certain numbered version of the GNU General Public
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that numbered version or
+of any later version published by the Free Software Foundation. If
+the Program does not specify a version number of the GNU General
+Public License, you may choose any version ever published by the Free
+Software Foundation.
+
+If the Program specifies that a proxy can decide which future versions
+of the GNU General Public License can be used, that proxy's public
+statement of acceptance of a version permanently authorizes you to
+choose that version for the Program.
+
+Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+@item Disclaimer of Warranty.
+
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT
+WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.
+
+@item Limitation of Liability.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
+CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT
+NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
+LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM
+TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
+PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+@item Interpretation of Sections 15 and 16.
+
+If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+@end enumerate
+
+@heading END OF TERMS AND CONDITIONS
+
+@heading How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the ``copyright'' line and a pointer to where the full notice is found.
+
+@smallexample
+@var{one line to give the program's name and a brief idea of what it does.}
+Copyright (C) @var{year} @var{name of author}
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see @url{http://www.gnu.org/licenses/}.
+@end smallexample
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+@smallexample
+@var{program} Copyright (C) @var{year} @var{name of author}
+This program comes with ABSOLUTELY NO WARRANTY; for details type @samp{show w}.
+This is free software, and you are welcome to redistribute it
+under certain conditions; type @samp{show c} for details.
+@end smallexample
+
+The hypothetical commands @samp{show w} and @samp{show c} should show
+the appropriate parts of the General Public License. Of course, your
+program's commands might be different; for a GUI interface, you would
+use an ``about box''.
+
+You should also get your employer (if you work as a programmer) or school,
+if any, to sign a ``copyright disclaimer'' for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+@url{http://www.gnu.org/licenses/}.
+
+The GNU General Public License does not permit incorporating your
+program into proprietary programs. If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library. If this is what you want to do, use
+the GNU Lesser General Public License instead of this License. But
+first, please read @url{http://www.gnu.org/philosophy/why-not-lgpl.html}.
diff --git a/doc/lgpl.texi b/doc/lgpl.texi
new file mode 100644
index 00000000..c29a6fb4
--- /dev/null
+++ b/doc/lgpl.texi
@@ -0,0 +1,190 @@
+@c The GNU Lesser General Public License.
+@center Version 3, 29 June 2007
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+@end display
+
+This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+@enumerate 0
+@item Additional Definitions.
+
+As used herein, ``this License'' refers to version 3 of the GNU Lesser
+General Public License, and the ``GNU GPL'' refers to version 3 of the GNU
+General Public License.
+
+``The Library'' refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+An ``Application'' is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+A ``Combined Work'' is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the ``Linked
+Version''.
+
+The ``Minimal Corresponding Source'' for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+The ``Corresponding Application Code'' for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+@item Exception to Section 3 of the GNU GPL.
+
+You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+@item Conveying Modified Versions.
+
+If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+@enumerate a
+@item
+under this License, provided that you make a good faith effort to
+ensure that, in the event an Application does not supply the
+function or data, the facility still operates, and performs
+whatever part of its purpose remains meaningful, or
+
+@item
+under the GNU GPL, with none of the additional permissions of
+this License applicable to that copy.
+@end enumerate
+
+@item Object Code Incorporating Material from Library Header Files.
+
+The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+@enumerate a
+@item
+Give prominent notice with each copy of the object code that the
+Library is used in it and that the Library and its use are
+covered by this License.
+@item
+Accompany the object code with a copy of the GNU GPL and this license
+document.
+@end enumerate
+
+@item Combined Works.
+
+You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+@enumerate a
+@item
+Give prominent notice with each copy of the Combined Work that
+the Library is used in it and that the Library and its use are
+covered by this License.
+@item
+Accompany the Combined Work with a copy of the GNU GPL and this license
+document.
+@item
+For a Combined Work that displays copyright notices during
+execution, include the copyright notice for the Library among
+these notices, as well as a reference directing the user to the
+copies of the GNU GPL and this license document.
+@item
+Do one of the following:
+
+@enumerate 0
+@item
+Convey the Minimal Corresponding Source under the terms of this
+License, and the Corresponding Application Code in a form
+suitable for, and under terms that permit, the user to
+recombine or relink the Application with a modified version of
+the Linked Version to produce a modified Combined Work, in the
+manner specified by section 6 of the GNU GPL for conveying
+Corresponding Source.
+@item
+Use a suitable shared library mechanism for linking with the
+Library. A suitable mechanism is one that (a) uses at run time
+a copy of the Library already present on the user's computer
+system, and (b) will operate properly with a modified version
+of the Library that is interface-compatible with the Linked
+Version.
+@end enumerate
+
+@item
+Provide Installation Information, but only if you would otherwise
+be required to provide such information under section 6 of the
+GNU GPL, and only to the extent that such information is
+necessary to install and execute a modified version of the
+Combined Work produced by recombining or relinking the
+Application with a modified version of the Linked Version. (If
+you use option 4d0, the Installation Information must accompany
+the Minimal Corresponding Source and Corresponding Application
+Code. If you use option 4d1, you must provide the Installation
+Information in the manner specified by section 6 of the GNU GPL
+for conveying Corresponding Source.)
+@end enumerate
+
+@item Combined Libraries.
+
+You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+@enumerate a
+@item
+Accompany the combined library with a copy of the same work based
+on the Library, uncombined with any other library facilities,
+conveyed under the terms of this License.
+@item
+Give prominent notice with the combined library that part of it
+is a work based on the Library, and explaining where to find the
+accompanying uncombined form of the same work.
+@end enumerate
+
+@item Revised Versions of the GNU Lesser General Public License.
+
+The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License ``or any later version''
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
+@end enumerate
diff --git a/doc/libunistring.info b/doc/libunistring.info
new file mode 100644
index 00000000..2fad8fec
--- /dev/null
+++ b/doc/libunistring.info
@@ -0,0 +1,6200 @@
+This is libunistring.info, produced by makeinfo version 4.13 from
+libunistring.texi.
+
+INFO-DIR-SECTION Software development
+START-INFO-DIR-ENTRY
+* GNU libunistring: (libunistring). Unicode string library.
+END-INFO-DIR-ENTRY
+
+ This manual is for GNU libunistring.
+
+
+File: libunistring.info, Node: Top, Next: Introduction, Up: (dir)
+
+GNU libunistring
+****************
+
+* Menu:
+
+* Introduction:: Who may need Unicode strings?
+* Conventions:: Conventions used in this manual
+* unitypes.h:: Elementary types
+* unistr.h:: Elementary Unicode string functions
+* uniconv.h:: Conversions between Unicode and encodings
+* unistdio.h:: Output with Unicode strings
+* uniname.h:: Names of Unicode characters
+* unictype.h:: Unicode character classification and properties
+* uniwidth.h:: Display width
+* uniwbrk.h:: Word breaks in strings
+* unilbrk.h:: Line breaking
+* uninorm.h:: Normalization forms
+* unicase.h:: Case mappings
+* uniregex.h:: Regular expressions
+* Using the library:: How to link with the library and use it?
+* More functionality:: More advanced functionality
+* Licenses:: Licenses
+
+* Index:: General Index
+
+ --- The Detailed Node Listing ---
+
+Introduction
+
+* Unicode:: What is Unicode?
+* Unicode and i18n:: Unicode and internationalization
+* Locale encodings:: What is a locale encoding?
+* In-memory representation:: How to represent strings in memory?
+* char * strings:: What to keep in mind with `char *' strings
+* The wchar_t mess:: Why `wchar_t *' strings are useless
+* Unicode strings:: How are Unicode strings represented?
+
+unistr.h
+
+* Elementary string checks::
+* Elementary string conversions::
+* Elementary string functions::
+* Elementary string functions with memory allocation::
+* Elementary string functions on NUL terminated strings::
+
+unictype.h
+
+* General category::
+* Canonical combining class::
+* Bidirectional category::
+* Decimal digit value::
+* Digit value::
+* Numeric value::
+* Mirrored character::
+* Properties::
+* Scripts::
+* Blocks::
+* ISO C and Java syntax::
+* Classifications like in ISO C::
+
+General category
+
+* Object oriented API::
+* Bit mask API::
+
+Properties
+
+* Properties as objects::
+* Properties as functions::
+
+uniwbrk.h
+
+* Word breaks in a string::
+* Word break property::
+
+uninorm.h
+
+* Decomposition of characters::
+* Composition of characters::
+* Normalization of strings::
+* Normalizing comparisons::
+* Normalization of streams::
+
+unicase,h
+
+* Case mappings of characters::
+* Case mappings of strings::
+* Case mappings of substrings::
+* Case insensitive comparison::
+* Case detection::
+
+Using the library
+
+* Installation::
+* Compiler options::
+* Include files::
+* Autoconf macro::
+* Reporting problems::
+
+Licenses
+
+* GNU GPL:: GNU General Public License
+* GNU LGPL:: GNU Lesser General Public License
+* GNU FDL:: GNU Free Documentation License
+
+
+File: libunistring.info, Node: Introduction, Next: Conventions, Prev: Top, Up: Top
+
+1 Introduction
+**************
+
+ This library provides functions for manipulating Unicode strings and
+for manipulating C strings according to the Unicode standard.
+
+ It consists of the following parts:
+
+`<unistr.h>'
+ elementary string functions
+
+`<uniconv.h>'
+ conversion from/to legacy encodings
+
+`<unistdio.h>'
+ formatted output to strings
+
+`<uniname.h>'
+ character names
+
+`<unictype.h>'
+ character classification and properties
+
+`<uniwidth.h>'
+ string width when using nonproportional fonts
+
+`<uniwbrk.h>'
+ word breaks
+
+`<unilbrk.h>'
+ line breaking algorithm
+
+`<uninorm.h>'
+ normalization (composition and decomposition)
+
+`<unicase.h>'
+ case folding
+
+`<uniregex.h>'
+ regular expressions (not yet implemented)
+
+ libunistring is for you if your application involves non-trivial text
+processing, such as upper/lower case conversions, line breaking,
+operations on words, or more advanced analysis of text. Text provided
+by the user can, in general, contain characters of all kinds of
+scripts. The text processing functions provided by this library handle
+all scripts and all languages.
+
+ libunistring is for you if your application already uses the ISO C /
+POSIX `<ctype.h>', `<wctype.h>' functions and the text it operates on is
+provided by the user and can be in any language.
+
+ libunistring is also for you if your application uses Unicode
+strings as internal in-memory representation.
+
+* Menu:
+
+* Unicode:: What is Unicode?
+* Unicode and i18n:: Unicode and internationalization
+* Locale encodings:: What is a locale encoding?
+* In-memory representation:: How to represent strings in memory?
+* char * strings:: What to keep in mind with `char *' strings
+* The wchar_t mess:: Why `wchar_t *' strings are useless
+* Unicode strings:: How are Unicode strings represented?
+
+
+File: libunistring.info, Node: Unicode, Next: Unicode and i18n, Up: Introduction
+
+1.1 Unicode
+===========
+
+ Unicode is a standardized repertoire of characters that contains
+characters from all scripts of the world, from Latin letters to Chinese
+ideographs and Babylonian cuneiform glyphs. It also specifies how
+these characters are to be rendered on a screen or on paper, and how
+common text processing (word selection, line breaking, uppercasing of
+page titles etc.) is supposed to behave on Unicode text.
+
+ Unicode also specifies three ways of storing sequences of Unicode
+characters in a computer whose basic unit of data is an 8-bit byte:
+UTF-8
+ Every character is represented as 1 to 4 bytes.
+
+UTF-16
+ Every character is represented as 1 to 2 units of 16 bits.
+
+UTF-32, a.k.a. UCS-4
+ Every character is represented as 1 unit of 32 bits.
+
+ For encoding Unicode text in a file, UTF-8 is usually used. For
+encoding Unicode strings in memory for a program, either of the three
+encoding forms can be reasonably used.
+
+ Unicode is widely used on the web. Prior to the use of Unicode, web
+pages were in many different encodings (ISO-8859-1 for English, French,
+Spanish, ISO-8859-2 for Polish, ISO-8859-7 for Greek, KOI8-R for
+Russian, GB2312 or BIG5 for Chinese, ISO-2022-JP-2 or EUC-JP or
+Shift_JIS for Japanese, and many many others). It was next to
+impossible to create a document that contained Chinese and Polish text
+in the same document. Due to the many encodings for Japanese, even the
+processing of pure Japanese text was error prone.
+
+ References:
+ * The Unicode standard: `http://www.unicode.org/'
+
+ * Definition of UTF-8: `http://www.rfc-editor.org/rfc/rfc3629.txt'
+
+ * Definition of UTF-16: `http://www.rfc-editor.org/rfc/rfc2781.txt'
+
+ * Markus Kuhn's UTF-8 and Unicode FAQ:
+ `http://www.cl.cam.ac.uk/~mgk25/unicode.html'
+
+
+File: libunistring.info, Node: Unicode and i18n, Next: Locale encodings, Prev: Unicode, Up: Introduction
+
+1.2 Unicode and Internationalization
+====================================
+
+ Internationalization is the process of changing the source code of a
+program so that it can meet the expectations of users in any culture,
+if culture specific data (translations, images etc.) are provided.
+
+ Use of Unicode is not strictly required for internationalization,
+but it makes internationalization much easier, because operations that
+need to look at specific characters (like hyphenation, spell checking,
+or the automatic conversion of double-quotes to opening and closing
+double-quote characters) don't need to consider multiple possible
+encodings of the text.
+
+ Use of Unicode also enables multilingualization: the ability of
+having text in multiple languages present in the same document or even
+in the same line of text.
+
+ But use of Unicode is not everything. Internationalization usually
+consists of three features:
+ * Use of Unicode where needed for text processing. This is what
+ this library is for.
+
+ * Use of message catalogs for messages shown to the user, This is
+ what GNU gettext is about.
+
+ * Use of locale specific conventions for date and time formats, for
+ numeric formatting, or for sorting of text. This can be done
+ adequately with the POSIX APIs and the implementation of locales
+ in the GNU C library.
+
+
+File: libunistring.info, Node: Locale encodings, Next: In-memory representation, Prev: Unicode and i18n, Up: Introduction
+
+1.3 Locale encodings
+====================
+
+ A locale is a set of cultural conventions. According to POSIX, for
+a program, at any moment, there is one locale being designated as the
+"current locale". (Actually, POSIX supports also one locale per
+thread, but this feature is not yet universally implemented and not
+widely used.) The locale is partitioned into several aspects, called
+the "categories" of the locale. The main various aspects are:
+ * The character encoding and the character properties. This is the
+ `LC_CTYPE' category.
+
+ * The sorting rules for text. This is the `LC_COLLATE' category.
+
+ * The language specific translations of messages. This is the
+ `LC_MESSAGES' category.
+
+ * The formatting rules for numbers, such as the decimal separator.
+ This is the `LC_NUMERIC' category.
+
+ * The formatting rules for amounts of money. This is the
+ `LC_MONETARY' category.
+
+ * The formatting of date and time. This is the `LC_TIME' category.
+
+ In particular, the `LC_CTYPE' category of the current locale
+determines the character encoding. This is the encoding of `char *'
+strings. We also call it the "locale encoding". GNU libunistring has
+a function, `locale_charset', that returns a standardized (platform
+independent) name for this encoding.
+
+ All locale encodings used on glibc systems are essentially ASCII
+compatible: Most graphic ASCII characters have the same representation,
+as a single byte, in that encoding as in ASCII.
+
+ Among the possible locale encodings are UTF-8 and GB18030. Both
+allow to represent any Unicode character as a sequence of bytes. UTF-8
+is used in most of the world, whereas GB18030 is used in the People's
+Republic of China, because it is backward compatible with the GB2312
+encoding that was used in this country earlier.
+
+ The legacy locale encodings, ISO-8859-15 (which supplanted
+ISO-8859-1 in most of Europe), ISO-8859-2, KOI8-R, EUC-JP, etc., are
+still in use in many places, though.
+
+ UTF-16 and UTF-32 are not used as locale encodings, because they are
+not ASCII compatible.
+
+
+File: libunistring.info, Node: In-memory representation, Next: char * strings, Prev: Locale encodings, Up: Introduction
+
+1.4 Choice of in-memory representation of strings
+=================================================
+
+ There are three ways of representing strings in memory of a running
+program.
+ * As `char *' strings. Such strings are represented in locale
+ encoding. This approach is employed when not much text processing
+ is done by the program. When some Unicode aware processing is to
+ be done, a string is converted to Unicode on the fly and back to
+ locale encoding afterwards.
+
+ * As UTF-8 or UTF-16 or UTF-32 strings. This implies that
+ conversion from locale encoding to Unicode is performed on input,
+ and in the opposite direction on output. This approach is
+ employed when the program does a significant amount of text
+ processing, or when the program has multiple threads operating on
+ the same data but in different locales.
+
+ * As `wchar_t *', a.k.a. "wide strings". This approach is misguided,
+ see *note The wchar_t mess::.
+
+
+File: libunistring.info, Node: char * strings, Next: The wchar_t mess, Prev: In-memory representation, Up: Introduction
+
+1.5 `char *' strings
+====================
+
+ The classical C strings, with its C library support standardized by
+ISO C and POSIX, can be used in internationalized programs with some
+precautions. The problem with this API is that many of the C library
+functions for strings don't work correctly on strings in locale
+encodings, leading to bugs that only people in some cultures of the
+world will experience.
+
+ The first problem with the C library API is the support of multibyte
+locales. According to the locale encoding, in general, every character
+is represented by one or more bytes (up to 4 bytes in practice -- but
+use `MB_LEN_MAX' instead of the number 4 in the code). When every
+character is represented by only 1 byte, we speak of an "unibyte
+locale", otherwise of a "multibyte locale". It is important to realize
+that the majority of Unix installations nowadays use UTF-8 or GB18030
+as locale encoding; therefore, the majority of users are using
+multibyte locales.
+
+ The important fact to remember is: _A `char' is a byte, not a
+character._
+
+ As a consequence:
+ * The `<ctype.h>' API is useless in this context; it does not work in
+ multibyte locales.
+
+ * The `strlen' function does not return the number of characters in
+ a string. Nor does it return the number of screen columns occupied
+ by a string after it is output. It merely returns the number of
+ _bytes_ occupied by a string.
+
+ * Truncating a string, for example, with `strncpy', can have the
+ effect of truncating it in the middle of a multibyte character.
+ Such a string will, when output, have a garbled character at its
+ end, often represented by a hollow box.
+
+ * `strchr' and `strrchr' do not work with multibyte strings if the
+ locale encoding is GB18030 and the character to be searched is a
+ digit.
+
+ * `strstr' does not work with multibyte strings if the locale
+ encoding is different from UTF-8.
+
+ * `strcspn', `strpbrk', `strspn' cannot work correctly in multibyte
+ locales: they assume the second argument is a list of single-byte
+ characters. Even in this simple case, they do not work with
+ multibyte strings if the locale encoding is GB18030 and one of the
+ characters to be searched is a digit.
+
+ * `strsep' and `strtok_r' do not work with multibyte strings unless
+ all of the delimiter characters are ASCII characters < 0x30.
+
+ * The `strcasecmp', `strncasecmp', and `strcasestr' functions do not
+ work with multibyte strings.
+
+ The workarounds can be found in GNU gnulib
+`http://www.gnu.org/software/gnulib/'.
+ * gnulib has modules `mbchar', `mbiter', `mbuiter' that represent
+ multibyte characters and allow to iterate across a multibyte
+ string with the same ease as through a unibyte string.
+
+ * gnulib has functions `mbslen' and `mbswidth' that can be used
+ instead of `strlen' when the number of characters or the number of
+ screen columns of a string is requested.
+
+ * gnulib has functions `mbschr' and `mbsrrchr' that are like
+ `strchr' and `strrchr', but work in multibyte locales.
+
+ * gnulib has a function `mbsstr', like `strstr', but works in
+ multibyte locales.
+
+ * gnulib has functions `mbscspn', `mbspbrk', `mbsspn' that are like
+ `strcspn', `strpbrk', `strspn', but work in multibyte locales.
+
+ * gnulib has functions `mbssep' and `mbstok_r' that are like
+ `strsep' and `strtok_r' but work in multibyte locales.
+
+ * gnulib has functions `mbscasecmp', `mbsncasecmp', `mbspcasecmp',
+ and `mbscasestr' that are like `strcasecmp', `strncasecmp', and
+ `strcasestr', but work in multibyte locales. Still, the function
+ `ulc_casecmp' is preferable to these functions; see below.
+
+ The second problem with the C library API is that it has some
+assumptions built-in that are not valid in some languages:
+ * It assumes that there are only two forms of every character:
+ uppercase and lowercase. This is not true for Croatian, where the
+ character LETTER DZ WITH CARON comes in three forms: LATIN CAPITAL
+ LETTER DZ WITH CARON (DZ), LATIN CAPITAL LETTER D WITH SMALL
+ LETTER Z WITH CARON (Dz), LATIN SMALL LETTER DZ WITH CARON (dz).
+
+ * It assumes that uppercasing of 1 character leads to 1 character.
+ This is not true for German, where the LATIN SMALL LETTER SHARP S,
+ when uppercased, becomes `SS'.
+
+ * It assumes that there is 1:1 mapping between uppercase and
+ lowercase forms. This is not true for the Greek sigma: GREEK
+ CAPITAL LETTER SIGMA is the uppercase of both GREEK SMALL LETTER
+ SIGMA and GREEK SMALL LETTER FINAL SIGMA.
+
+ * It assumes that the upper/lowercase mappings are position
+ independent. This is not true for the Greek sigma and the
+ Lithuanian i.
+
+ The correct way to deal with this problem is
+ 1. to provide functions for titlecasing, as well as for upper- and
+ lowercasing,
+
+ 2. to view case transformations as functions that operates on strings,
+ rather than on characters.
+
+ This is implemented in this library, through the functions declared
+in `<unicase.h>', see *note unicase.h::.
+
+
+File: libunistring.info, Node: The wchar_t mess, Next: Unicode strings, Prev: char * strings, Up: Introduction
+
+1.6 The `wchar_t' mess
+======================
+
+ The ISO C and POSIX standard creators made an attempt to fix the
+first problem mentioned in the previous section. They introduced
+ * a type `wchar_t', designed to encapsulate an entire character,
+
+ * a "wide string" type `wchar_t *', and
+
+ * functions declared in `<wctype.h>' that were meant to supplant the
+ ones in `<ctype.h>'.
+
+ Unfortunately, this API and its implementation has numerous problems:
+
+ * On AIX and Windows platforms, `wchar_t' is a 16-bit type. This
+ means that it can never accommodate an entire Unicode character.
+ Either the `wchar_t *' strings are limited to characters in UCS-2
+ (the "Basic Multilingual Plane" of Unicode), or -- if `wchar_t *'
+ strings are encoded in UTF-16 -- a `wchar_t' represents only half
+ of a character in the worst case, making the `<wctype.h>' functions
+ pointless.
+
+ * On Solaris and FreeBSD, the `wchar_t' encoding is locale dependent
+ and undocumented. This means, if you want to know any property of
+ a `wchar_t' character, other than the properties defined by
+ `<wctype.h>' -- such as whether it's a dash, currency symbol,
+ paragraph separator, or similar --, you have to convert it to
+ `char *' encoding first, by use of the function `wctomb'.
+
+ * When you read a stream of wide characters, through the functions
+ `fgetwc' and `fgetws', and when the input stream/file is not in
+ the expected encoding, you have no way to determine the invalid
+ byte sequence and do some corrective action. If you use these
+ functions, your program becomes "garbage in - more garbage out" or
+ "garbage in - abort".
+
+ As a consequence, it is better to use multibyte strings, as
+explained in the previous section. Such multibyte strings can bypass
+limitations of the `wchar_t' type, if you use functions defined in
+gnulib and libunistring for text processing. They can also faithfully
+transport malformed characters that were present in the input, without
+requiring the program to produce garbage or abort.
+
+
+File: libunistring.info, Node: Unicode strings, Prev: The wchar_t mess, Up: Introduction
+
+1.7 Unicode strings
+===================
+
+ libunistring supports Unicode strings in three representations:
+ * UTF-8 strings, through the type `uint8_t *'. The units are bytes
+ (`uint8_t').
+
+ * UTF-16 strings, through the type `uint16_t *', The units are
+ 16-bit memory words (`uint16_t').
+
+ * UTF-32 strings, through the type `uint32_t *'. The units are
+ 32-bit memory words (`uint32_t').
+
+ As with C strings, there are two variants:
+ * Unicode strings with a terminating NUL character are represented as
+ a pointer to the first unit of the string. There is a unit
+ containing a 0 value at the end. It is considered part of the
+ string for all memory allocation purposes, but is not considered
+ part of the string for all other logical purposes.
+
+ * Unicode strings where embedded NUL characters are allowed. These
+ are represented by a pointer to the first unit and the number of
+ units (not bytes!) of the string. In this setting, there is no
+ trailing zero-valued unit used as "end marker".
+
+
+File: libunistring.info, Node: Conventions, Next: unitypes.h, Prev: Introduction, Up: Top
+
+2 Conventions
+*************
+
+ This chapter explains conventions valid throughout the libunistring
+library.
+
+ Variables of type `char *' denote C strings in locale encoding. See
+*note Locale encodings::.
+
+ Variables of type `uint8_t *' denote UTF-8 strings. Their units are
+bytes.
+
+ Variables of type `uint16_t *' denote UTF-16 strings, without byte
+order mark. Their units are 2-byte words.
+
+ Variables of type `uint32_t *' denote UTF-32 strings, without byte
+order mark. Their units are 4-byte words.
+
+ Argument pairs `(S, N)' denote a string `S[0..N-1]' with exactly N
+units.
+
+ All functions with prefix `ulc_' operate on C strings in locale
+encoding.
+
+ All functions with prefix `u8_' operate on UTF-8 strings.
+
+ All functions with prefix `u16_' operate on UTF-16 strings.
+
+ All functions with prefix `u32_' operate on UTF-32 strings.
+
+ For every function with prefix `u8_', operating on UTF-8 strings,
+there is also a corresponding function with prefix `u16_', operating on
+UTF-16 strings, and a corresponding function with prefix `u32_',
+operating on UTF-32 strings. Their description is analogous; in this
+documentation we describe only the function that operates on UTF-8
+strings, for brevity.
+
+ A declaration with a variable N denotes the three concrete
+declarations with N = 8, N = 16, N = 32.
+
+ All parameters starting with `str' and the parameters of functions
+starting with `u8_str'/`u16_str'/`u32_str' denote a NUL terminated
+string.
+
+ Error values are always returned through the `errno' variable,
+usually with a return value that indicates the presence of an error
+(NULL for functions that return an pointer, or -1 for functions that
+return an `int').
+
+ Functions returning a string result take a `(RESULTBUF, LENGTHP)'
+argument pair. If RESULTBUF is not NULL and the result fits into
+`*LENGTHP' units, it is put in RESULTBUF, and RESULTBUF is returned.
+Otherwise, a freshly allocated string is returned. In both cases,
+`*LENGTHP' is set to the length (number of units) of the returned
+string. In case of error, NULL is returned and `errno' is set.
+
+
+File: libunistring.info, Node: unitypes.h, Next: unistr.h, Prev: Conventions, Up: Top
+
+3 Elementary types `<unitypes.h>'
+*********************************
+
+ The include file `<unitypes.h>' provides the following basic types.
+
+ -- Type: uint8_t
+ -- Type: uint16_t
+ -- Type: uint32_t
+ These are the storage units of UTF-8/16/32 strings, respectively.
+ The definitions are taken from `<stdint.h>', on platforms where
+ this include file is present.
+
+ -- Type: ucs4_t
+ This type represents a single Unicode character, outside of an
+ UTF-32 string.
+
+
+File: libunistring.info, Node: unistr.h, Next: uniconv.h, Prev: unitypes.h, Up: Top
+
+4 Elementary Unicode string functions `<unistr.h>'
+**************************************************
+
+ This include file declares elementary functions for Unicode strings.
+It is essentially the equivalent of what `<string.h>' is for C strings.
+
+* Menu:
+
+* Elementary string checks::
+* Elementary string conversions::
+* Elementary string functions::
+* Elementary string functions with memory allocation::
+* Elementary string functions on NUL terminated strings::
+
+
+File: libunistring.info, Node: Elementary string checks, Next: Elementary string conversions, Up: unistr.h
+
+4.1 Elementary string checks
+============================
+
+ The following function is available to verify the integrity of a
+Unicode string.
+
+ -- Function: const uint8_t * u8_check (const uint8_t *S, size_t N)
+ -- Function: const uint16_t * u16_check (const uint16_t *S, size_t N)
+ -- Function: const uint32_t * u32_check (const uint32_t *S, size_t N)
+ This function checks whether a Unicode string is well-formed. It
+ returns NULL if valid, or a pointer to the first invalid unit
+ otherwise.
+
+
+File: libunistring.info, Node: Elementary string conversions, Next: Elementary string functions, Prev: Elementary string checks, Up: unistr.h
+
+4.2 Elementary string conversions
+=================================
+
+ The following functions perform conversions between the different
+forms of Unicode strings.
+
+ -- Function: uint16_t * u8_to_u16 (const uint8_t *S, size_t N,
+ uint16_t *RESULTBUF, size_t *LENGTHP)
+ Converts an UTF-8 string to an UTF-16 string.
+
+ -- Function: uint32_t * u8_to_u32 (const uint8_t *S, size_t N,
+ uint32_t *RESULTBUF, size_t *LENGTHP)
+ Converts an UTF-8 string to an UTF-32 string.
+
+ -- Function: uint8_t * u16_to_u8 (const uint16_t *S, size_t N, uint8_t
+ *RESULTBUF, size_t *LENGTHP)
+ Converts an UTF-16 string to an UTF-8 string.
+
+ -- Function: uint32_t * u16_to_u32 (const uint16_t *S, size_t N,
+ uint32_t *RESULTBUF, size_t *LENGTHP)
+ Converts an UTF-16 string to an UTF-32 string.
+
+ -- Function: uint8_t * u32_to_u8 (const uint32_t *S, size_t N, uint8_t
+ *RESULTBUF, size_t *LENGTHP)
+ Converts an UTF-32 string to an UTF-8 string.
+
+ -- Function: uint16_t * u32_to_u16 (const uint32_t *S, size_t N,
+ uint16_t *RESULTBUF, size_t *LENGTHP)
+ Converts an UTF-32 string to an UTF-16 string.
+
+
+File: libunistring.info, Node: Elementary string functions, Next: Elementary string functions with memory allocation, Prev: Elementary string conversions, Up: unistr.h
+
+4.3 Elementary string functions
+===============================
+
+ The following functions inspect and return details about the first
+character in a Unicode string.
+
+ -- Function: int u8_mblen (const uint8_t *S, size_t N)
+ -- Function: int u16_mblen (const uint16_t *S, size_t N)
+ -- Function: int u32_mblen (const uint32_t *S, size_t N)
+ Returns the length (number of units) of the first character in S,
+ which is no longer than N. Returns 0 if it is the NUL character.
+ Returns -1 upon failure.
+
+ This function is similar to `mblen', except that it operates on a
+ Unicode string and that S must not be NULL.
+
+ -- Function: int u8_mbtouc_unsafe (ucs4_t *PUC, const uint8_t *S,
+ size_t N)
+ -- Function: int u16_mbtouc_unsafe (ucs4_t *PUC, const uint16_t *S,
+ size_t N)
+ -- Function: int u32_mbtouc_unsafe (ucs4_t *PUC, const uint32_t *S,
+ size_t N)
+ Returns the length (number of units) of the first character in S,
+ putting its `ucs4_t' representation in `*PUC'. Upon failure,
+ `*PUC' is set to `0xfffd', and an appropriate number of units is
+ returned.
+
+ The number of available units, N, must be > 0.
+
+ This function is similar to `mbtowc', except that it operates on a
+ Unicode string, PUC and S must not be NULL, N must be > 0, and the
+ NUL character is not treated specially.
+
+ -- Function: int u8_mbtouc (ucs4_t *PUC, const uint8_t *S, size_t N)
+ -- Function: int u16_mbtouc (ucs4_t *PUC, const uint16_t *S, size_t N)
+ -- Function: int u32_mbtouc (ucs4_t *PUC, const uint32_t *S, size_t N)
+ This function is like `u8_mbtouc_unsafe', except that it will
+ detect an invalid UTF-8 character, even if the library is compiled
+ without `--enable-safety'.
+
+ -- Function: int u8_mbtoucr (ucs4_t *PUC, const uint8_t *S, size_t N)
+ -- Function: int u16_mbtoucr (ucs4_t *PUC, const uint16_t *S, size_t N)
+ -- Function: int u32_mbtoucr (ucs4_t *PUC, const uint32_t *S, size_t N)
+ Returns the length (number of units) of the first character in S,
+ putting its `ucs4_t' representation in `*PUC'. Upon failure,
+ `*PUC' is set to `0xfffd', and -1 is returned for an invalid
+ sequence of units, -2 is returned for an incomplete sequence of
+ units.
+
+ The number of available units, N, must be > 0.
+
+ This function is similar to `u8_mbtouc', except that the return
+ value gives more details about the failure, similar to `mbrtowc'.
+
+ The following function stores a Unicode character as a Unicode
+string in memory.
+
+ -- Function: int u8_uctomb (uint8_t *S, ucs4_t UC, int N)
+ -- Function: int u16_uctomb (uint16_t *S, ucs4_t UC, int N)
+ -- Function: int u32_uctomb (uint32_t *S, ucs4_t UC, int N)
+ Puts the multibyte character represented by UC in S, returning its
+ length. Returns -1 upon failure, -2 if the number of available
+ units, N, is too small. The latter case cannot occur if N >=
+ 6/2/1, respectively.
+
+ This function is similar to `wctomb', except that it operates on a
+ Unicode strings, S must not be NULL, and the argument N must be
+ specified.
+
+ The following functions copy Unicode strings in memory.
+
+ -- Function: uint8_t * u8_cpy (uint8_t *DEST, const uint8_t *SRC,
+ size_t N)
+ -- Function: uint16_t * u16_cpy (uint16_t *DEST, const uint16_t *SRC,
+ size_t N)
+ -- Function: uint32_t * u32_cpy (uint32_t *DEST, const uint32_t *SRC,
+ size_t N)
+ Copies N units from SRC to DEST.
+
+ This function is similar to `memcpy', except that it operates on
+ Unicode strings.
+
+ -- Function: uint8_t * u8_move (uint8_t *DEST, const uint8_t *SRC,
+ size_t N)
+ -- Function: uint16_t * u16_move (uint16_t *DEST, const uint16_t *SRC,
+ size_t N)
+ -- Function: uint32_t * u32_move (uint32_t *DEST, const uint32_t *SRC,
+ size_t N)
+ Copies N units from SRC to DEST, guaranteeing correct behavior for
+ overlapping memory areas.
+
+ This function is similar to `memmove', except that it operates on
+ Unicode strings.
+
+ The following function fills a Unicode string.
+
+ -- Function: uint8_t * u8_set (uint8_t *S, ucs4_t UC, size_t N)
+ -- Function: uint16_t * u16_set (uint16_t *S, ucs4_t UC, size_t N)
+ -- Function: uint32_t * u32_set (uint32_t *S, ucs4_t UC, size_t N)
+ Sets the first N characters of S to UC. UC should be a character
+ that occupies only 1 unit.
+
+ This function is similar to `memset', except that it operates on
+ Unicode strings.
+
+ The following function compares two Unicode strings of the same
+length.
+
+ -- Function: int u8_cmp (const uint8_t *S1, const uint8_t *S2, size_t
+ N)
+ -- Function: int u16_cmp (const uint16_t *S1, const uint16_t *S2,
+ size_t N)
+ -- Function: int u32_cmp (const uint32_t *S1, const uint32_t *S2,
+ size_t N)
+ Compares S1 and S2, each of length N, lexicographically. Returns
+ a negative value if S1 compares smaller than S2, a positive value
+ if S1 compares larger than S2, or 0 if they compare equal.
+
+ This function is similar to `memcmp', except that it operates on
+ Unicode strings.
+
+ The following function compares two Unicode strings of possibly
+different lengths.
+
+ -- Function: int u8_cmp2 (const uint8_t *S1, size_t N1, const uint8_t
+ *S2, size_t N2)
+ -- Function: int u16_cmp2 (const uint16_t *S1, size_t N1, const
+ uint16_t *S2, size_t N2)
+ -- Function: int u32_cmp2 (const uint32_t *S1, size_t N1, const
+ uint32_t *S2, size_t N2)
+ Compares S1 and S2, lexicographically. Returns a negative value
+ if S1 compares smaller than S2, a positive value if S1 compares
+ larger than S2, or 0 if they compare equal.
+
+ This function is similar to the gnulib function `memcmp2', except
+ that it operates on Unicode strings.
+
+ The following function searches for a given Unicode character.
+
+ -- Function: uint8_t * u8_chr (const uint8_t *S, size_t N, ucs4_t UC)
+ -- Function: uint16_t * u16_chr (const uint16_t *S, size_t N, ucs4_t
+ UC)
+ -- Function: uint32_t * u32_chr (const uint32_t *S, size_t N, ucs4_t
+ UC)
+ Searches the string at S for UC. Returns a pointer to the first
+ occurrence of UC in S, or NULL if UC does not occur in S.
+
+ This function is similar to `memchr', except that it operates on
+ Unicode strings.
+
+ The following function counts the number of Unicode characters.
+
+ -- Function: size_t u8_mbsnlen (const uint8_t *S, size_t N)
+ -- Function: size_t u16_mbsnlen (const uint16_t *S, size_t N)
+ -- Function: size_t u32_mbsnlen (const uint32_t *S, size_t N)
+ Counts and returns the number of Unicode characters in the N units
+ from S.
+
+ This function is similar to the gnulib function `mbsnlen', except
+ that it operates on Unicode strings.
+
+
+File: libunistring.info, Node: Elementary string functions with memory allocation, Next: Elementary string functions on NUL terminated strings, Prev: Elementary string functions, Up: unistr.h
+
+4.4 Elementary string functions with memory allocation
+======================================================
+
+ The following function copies a Unicode string.
+
+ -- Function: uint8_t * u8_cpy_alloc (const uint8_t *S, size_t N)
+ -- Function: uint16_t * u16_cpy_alloc (const uint16_t *S, size_t N)
+ -- Function: uint32_t * u32_cpy_alloc (const uint32_t *S, size_t N)
+ Makes a freshly allocated copy of S, of length N.
+
+
+File: libunistring.info, Node: Elementary string functions on NUL terminated strings, Prev: Elementary string functions with memory allocation, Up: unistr.h
+
+4.5 Elementary string functions on NUL terminated strings
+=========================================================
+
+ The following functions inspect and return details about the first
+character in a Unicode string.
+
+ -- Function: int u8_strmblen (const uint8_t *S)
+ -- Function: int u16_strmblen (const uint16_t *S)
+ -- Function: int u32_strmblen (const uint32_t *S)
+ Returns the length (number of units) of the first character in S.
+ Returns 0 if it is the NUL character. Returns -1 upon failure.
+
+ -- Function: int u8_strmbtouc (ucs4_t *PUC, const uint8_t *S)
+ -- Function: int u16_strmbtouc (ucs4_t *PUC, const uint16_t *S)
+ -- Function: int u32_strmbtouc (ucs4_t *PUC, const uint32_t *S)
+ Returns the length (number of units) of the first character in S,
+ putting its `ucs4_t' representation in `*PUC'. Returns 0 if it is
+ the NUL character. Returns -1 upon failure.
+
+ -- Function: const uint8_t * u8_next (ucs4_t *PUC, const uint8_t *S)
+ -- Function: const uint16_t * u16_next (ucs4_t *PUC, const uint16_t *S)
+ -- Function: const uint32_t * u32_next (ucs4_t *PUC, const uint32_t *S)
+ Forward iteration step. Advances the pointer past the next
+ character, or returns NULL if the end of the string has been
+ reached. Puts the character's `ucs4_t' representation in `*PUC'.
+
+ The following function inspects and returns details about the
+previous character in a Unicode string.
+
+ -- Function: const uint8_t * u8_prev (ucs4_t *PUC, const uint8_t *S,
+ const uint8_t *START)
+ -- Function: const uint16_t * u16_prev (ucs4_t *PUC, const uint16_t
+ *S, const uint16_t *START)
+ -- Function: const uint32_t * u32_prev (ucs4_t *PUC, const uint32_t
+ *S, const uint32_t *START)
+ Backward iteration step. Advances the pointer to point to the
+ previous character, or returns NULL if the beginning of the string
+ had been reached. Puts the character's `ucs4_t' representation in
+ `*PUC'.
+
+ The following functions determine the length of a Unicode string.
+
+ -- Function: size_t u8_strlen (const uint8_t *S)
+ -- Function: size_t u16_strlen (const uint16_t *S)
+ -- Function: size_t u32_strlen (const uint32_t *S)
+ Returns the number of units in S.
+
+ This function is similar to `strlen' and `wcslen', except that it
+ operates on Unicode strings.
+
+ -- Function: size_t u8_strnlen (const uint8_t *S, size_t MAXLEN)
+ -- Function: size_t u16_strnlen (const uint16_t *S, size_t MAXLEN)
+ -- Function: size_t u32_strnlen (const uint32_t *S, size_t MAXLEN)
+ Returns the number of units in S, but at most MAXLEN.
+
+ This function is similar to `strnlen' and `wcsnlen', except that
+ it operates on Unicode strings.
+
+ The following functions copy portions of Unicode strings in memory.
+
+ -- Function: uint8_t * u8_strcpy (uint8_t *DEST, const uint8_t *SRC)
+ -- Function: uint16_t * u16_strcpy (uint16_t *DEST, const uint16_t
+ *SRC)
+ -- Function: uint32_t * u32_strcpy (uint32_t *DEST, const uint32_t
+ *SRC)
+ Copies SRC to DEST.
+
+ This function is similar to `strcpy' and `wcscpy', except that it
+ operates on Unicode strings.
+
+ -- Function: uint8_t * u8_stpcpy (uint8_t *DEST, const uint8_t *SRC)
+ -- Function: uint16_t * u16_stpcpy (uint16_t *DEST, const uint16_t
+ *SRC)
+ -- Function: uint32_t * u32_stpcpy (uint32_t *DEST, const uint32_t
+ *SRC)
+ Copies SRC to DEST, returning the address of the terminating NUL
+ in DEST.
+
+ This function is similar to `stpcpy', except that it operates on
+ Unicode strings.
+
+ -- Function: uint8_t * u8_strncpy (uint8_t *DEST, const uint8_t *SRC,
+ size_t N)
+ -- Function: uint16_t * u16_strncpy (uint16_t *DEST, const uint16_t
+ *SRC, size_t N)
+ -- Function: uint32_t * u32_strncpy (uint32_t *DEST, const uint32_t
+ *SRC, size_t N)
+ Copies no more than N units of SRC to DEST.
+
+ This function is similar to `strncpy' and `wcsncpy', except that
+ it operates on Unicode strings.
+
+ -- Function: uint8_t * u8_stpncpy (uint8_t *DEST, const uint8_t *SRC,
+ size_t N)
+ -- Function: uint16_t * u16_stpncpy (uint16_t *DEST, const uint16_t
+ *SRC, size_t N)
+ -- Function: uint32_t * u32_stpncpy (uint32_t *DEST, const uint32_t
+ *SRC, size_t N)
+ Copies no more than N units of SRC to DEST, returning the address
+ of the last unit written into DEST.
+
+ This function is similar to `stpncpy', except that it operates on
+ Unicode strings.
+
+ -- Function: uint8_t * u8_strcat (uint8_t *DEST, const uint8_t *SRC)
+ -- Function: uint16_t * u16_strcat (uint16_t *DEST, const uint16_t
+ *SRC)
+ -- Function: uint32_t * u32_strcat (uint32_t *DEST, const uint32_t
+ *SRC)
+ Appends SRC onto DEST.
+
+ This function is similar to `strcat' and `wcscat', except that it
+ operates on Unicode strings.
+
+ -- Function: uint8_t * u8_strncat (uint8_t *DEST, const uint8_t *SRC,
+ size_t N)
+ -- Function: uint16_t * u16_strncat (uint16_t *DEST, const uint16_t
+ *SRC, size_t N)
+ -- Function: uint32_t * u32_strncat (uint32_t *DEST, const uint32_t
+ *SRC, size_t N)
+ Appends no more than N units of SRC onto DEST.
+
+ This function is similar to `strncat' and `wcsncat', except that
+ it operates on Unicode strings.
+
+ The following functions compare two Unicode strings.
+
+ -- Function: int u8_strcmp (const uint8_t *S1, const uint8_t *S2)
+ -- Function: int u16_strcmp (const uint16_t *S1, const uint16_t *S2)
+ -- Function: int u32_strcmp (const uint32_t *S1, const uint32_t *S2)
+ Compares S1 and S2, lexicographically. Returns a negative value
+ if S1 compares smaller than S2, a positive value if S1 compares
+ larger than S2, or 0 if they compare equal.
+
+ This function is similar to `strcmp' and `wcscmp', except that it
+ operates on Unicode strings.
+
+ -- Function: int u8_strcoll (const uint8_t *S1, const uint8_t *S2)
+ -- Function: int u16_strcoll (const uint16_t *S1, const uint16_t *S2)
+ -- Function: int u32_strcoll (const uint32_t *S1, const uint32_t *S2)
+ Compares S1 and S2 using the collation rules of the current locale.
+ Returns -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2. Upon failure,
+ sets `errno' and returns any value.
+
+ This function is similar to `strcoll' and `wcscoll', except that
+ it operates on Unicode strings.
+
+ Note that this function may consider different canonical
+ normalizations of the same string as having a large distance. It
+ is therefore better to use the function `u8_normcoll' instead of
+ this one; see *note uninorm.h::.
+
+ -- Function: int u8_strncmp (const uint8_t *S1, const uint8_t *S2,
+ size_t N)
+ -- Function: int u16_strncmp (const uint16_t *S1, const uint16_t *S2,
+ size_t N)
+ -- Function: int u32_strncmp (const uint32_t *S1, const uint32_t *S2,
+ size_t N)
+ Compares no more than N units of S1 and S2.
+
+ This function is similar to `strncmp' and `wcsncmp', except that
+ it operates on Unicode strings.
+
+ The following function allocates a duplicate of a Unicode string.
+
+ -- Function: uint8_t * u8_strdup (const uint8_t *S)
+ -- Function: uint16_t * u16_strdup (const uint16_t *S)
+ -- Function: uint32_t * u32_strdup (const uint32_t *S)
+ Duplicates S, returning an identical malloc'd string.
+
+ This function is similar to `strdup' and `wcsdup', except that it
+ operates on Unicode strings.
+
+ The following functions search for a given Unicode character.
+
+ -- Function: uint8_t * u8_strchr (const uint8_t *STR, ucs4_t UC)
+ -- Function: uint16_t * u16_strchr (const uint16_t *STR, ucs4_t UC)
+ -- Function: uint32_t * u32_strchr (const uint32_t *STR, ucs4_t UC)
+ Finds the first occurrence of UC in STR.
+
+ This function is similar to `strchr' and `wcschr', except that it
+ operates on Unicode strings.
+
+ -- Function: uint8_t * u8_strrchr (const uint8_t *STR, ucs4_t UC)
+ -- Function: uint16_t * u16_strrchr (const uint16_t *STR, ucs4_t UC)
+ -- Function: uint32_t * u32_strrchr (const uint32_t *STR, ucs4_t UC)
+ Finds the last occurrence of UC in STR.
+
+ This function is similar to `strrchr' and `wcsrchr', except that
+ it operates on Unicode strings.
+
+ The following functions search for the first occurrence of some
+Unicode character in or outside a given set of Unicode characters.
+
+ -- Function: size_t u8_strcspn (const uint8_t *STR, const uint8_t
+ *REJECT)
+ -- Function: size_t u16_strcspn (const uint16_t *STR, const uint16_t
+ *REJECT)
+ -- Function: size_t u32_strcspn (const uint32_t *STR, const uint32_t
+ *REJECT)
+ Returns the length of the initial segment of STR which consists
+ entirely of Unicode characters not in REJECT.
+
+ This function is similar to `strcspn' and `wcscspn', except that
+ it operates on Unicode strings.
+
+ -- Function: size_t u8_strspn (const uint8_t *STR, const uint8_t
+ *ACCEPT)
+ -- Function: size_t u16_strspn (const uint16_t *STR, const uint16_t
+ *ACCEPT)
+ -- Function: size_t u32_strspn (const uint32_t *STR, const uint32_t
+ *ACCEPT)
+ Returns the length of the initial segment of STR which consists
+ entirely of Unicode characters in ACCEPT.
+
+ This function is similar to `strspn' and `wcsspn', except that it
+ operates on Unicode strings.
+
+ -- Function: uint8_t * u8_strpbrk (const uint8_t *STR, const uint8_t
+ *ACCEPT)
+ -- Function: uint16_t * u16_strpbrk (const uint16_t *STR, const
+ uint16_t *ACCEPT)
+ -- Function: uint32_t * u32_strpbrk (const uint32_t *STR, const
+ uint32_t *ACCEPT)
+ Finds the first occurrence in STR of any character in ACCEPT.
+
+ This function is similar to `strpbrk' and `wcspbrk', except that
+ it operates on Unicode strings.
+
+ The following functions search whether a given Unicode string is a
+substring of another Unicode string.
+
+ -- Function: uint8_t * u8_strstr (const uint8_t *HAYSTACK, const
+ uint8_t *NEEDLE)
+ -- Function: uint16_t * u16_strstr (const uint16_t *HAYSTACK, const
+ uint16_t *NEEDLE)
+ -- Function: uint32_t * u32_strstr (const uint32_t *HAYSTACK, const
+ uint32_t *NEEDLE)
+ Finds the first occurrence of NEEDLE in HAYSTACK.
+
+ This function is similar to `strstr' and `wcsstr', except that it
+ operates on Unicode strings.
+
+ -- Function: bool u8_startswith (const uint8_t *STR, const uint8_t
+ *PREFIX)
+ -- Function: bool u16_startswith (const uint16_t *STR, const uint16_t
+ *PREFIX)
+ -- Function: bool u32_startswith (const uint32_t *STR, const uint32_t
+ *PREFIX)
+ Tests whether STR starts with PREFIX.
+
+ -- Function: bool u8_endswith (const uint8_t *STR, const uint8_t
+ *SUFFIX)
+ -- Function: bool u16_endswith (const uint16_t *STR, const uint16_t
+ *SUFFIX)
+ -- Function: bool u32_endswith (const uint32_t *STR, const uint32_t
+ *SUFFIX)
+ Tests whether STR ends with SUFFIX.
+
+ The following function does one step in tokenizing a Unicode string.
+
+ -- Function: uint8_t * u8_strtok (uint8_t *STR, const uint8_t *DELIM,
+ uint8_t **PTR)
+ -- Function: uint16_t * u16_strtok (uint16_t *STR, const uint16_t
+ *DELIM, uint16_t **PTR)
+ -- Function: uint32_t * u32_strtok (uint32_t *STR, const uint32_t
+ *DELIM, uint32_t **PTR)
+ Divides STR into tokens separated by characters in DELIM.
+
+ This function is similar to `strtok_r' and `wcstok', except that
+ it operates on Unicode strings. Its interface is actually more
+ similar to `wcstok' than to `strtok'.
+
+
+File: libunistring.info, Node: uniconv.h, Next: unistdio.h, Prev: unistr.h, Up: Top
+
+5 Conversions between Unicode and encodings `<uniconv.h>'
+*********************************************************
+
+ This include file declares functions for converting between Unicode
+strings and `char *' strings in locale encoding or in other specified
+encodings.
+
+ The following function returns the locale encoding.
+
+ -- Function: const char * locale_charset ()
+ Determines the current locale's character encoding, and
+ canonicalizes it into one of the canonical names listed in
+ `config.charset'. If the canonical name cannot be determined, the
+ result is a non-canonical name.
+
+ The result must not be freed; it is statically allocated.
+
+ The result of this function can be used as an argument to the
+ `iconv_open' function in GNU libc, in GNU libiconv, or in the
+ gnulib provided wrapper around the native `iconv_open' function.
+ It may not work as an argument to the native `iconv_open' function
+ directly.
+
+ The handling of unconvertible characters during the conversions can
+be parametrized through the following enumeration type:
+
+ -- Type: enum iconv_ilseq_handler
+ This type specifies how unconvertible characters in the input are
+ handled.
+
+ -- Constant: enum iconv_ilseq_handler iconveh_error
+ This handler causes the function to return with `errno' set to
+ `EILSEQ'.
+
+ -- Constant: enum iconv_ilseq_handler iconveh_question_mark
+ This handler produces one question mark `?' per unconvertible
+ character.
+
+ -- Constant: enum iconv_ilseq_handler iconveh_escape_sequence
+ This handler produces an escape sequence `\uXXXX' or `\UXXXXXXXX'
+ for each unconvertible character.
+
+ The following functions convert between strings in a specified
+encoding and Unicode strings.
+
+ -- Function: uint8_t * u8_conv_from_encoding (const char *FROMCODE,
+ enum iconv_ilseq_handler HANDLER, const char *SRC, size_t
+ SRCLEN, size_t *OFFSETS, uint8_t *RESULTBUF, size_t *LENGTHP)
+ -- Function: uint16_t * u16_conv_from_encoding (const char *FROMCODE,
+ enum iconv_ilseq_handler HANDLER, const char *SRC, size_t
+ SRCLEN, size_t *OFFSETS, uint16_t *RESULTBUF, size_t *LENGTHP)
+ -- Function: uint32_t * u32_conv_from_encoding (const char *FROMCODE,
+ enum iconv_ilseq_handler HANDLER, const char *SRC, size_t
+ SRCLEN, size_t *OFFSETS, uint32_t *RESULTBUF, size_t *LENGTHP)
+ Converts an entire string, possibly including NUL bytes, from one
+ encoding to UTF-8 encoding.
+
+ Converts a memory region given in encoding FROMCODE. FROMCODE is
+ as for the `iconv_open' function.
+
+ The input is in the memory region between SRC (inclusive) and `SRC
+ + SRCLEN' (exclusive).
+
+ If OFFSETS is not NULL, it should point to an array of SRCLEN
+ integers; this array is filled with offsets into the result, i.e.
+ the character starting at `SRC[i]' corresponds to the character
+ starting at `RESULT[OFFSETS[i]]', and other offsets are set to
+ `(size_t)(-1)'.
+
+ `RESULTBUF' and `*LENGTHP' should be a scratch buffer and its
+ size, or `RESULTBUF' can be NULL.
+
+ May erase the contents of the memory at `RESULTBUF'.
+
+ If successful: The resulting Unicode string (non-NULL) is returned
+ and its length stored in `*LENGTHP'. The resulting string is
+ `RESULTBUF' if no dynamic memory allocation was necessary, or a
+ freshly allocated memory block otherwise.
+
+ In case of error: NULL is returned and `errno' is set. Particular
+ `errno' values: `EINVAL', `EILSEQ', `ENOMEM'.
+
+ -- Function: char * u8_conv_to_encoding (const char *TOCODE, enum
+ iconv_ilseq_handler HANDLER, const uint8_t *SRC, size_t
+ SRCLEN, size_t *OFFSETS, char *RESULTBUF, size_t *LENGTHP)
+ -- Function: char * u16_conv_to_encoding (const char *TOCODE, enum
+ iconv_ilseq_handler HANDLER, const uint16_t *SRC, size_t
+ SRCLEN, size_t *OFFSETS, char *RESULTBUF, size_t *LENGTHP)
+ -- Function: char * u32_conv_to_encoding (const char *TOCODE, enum
+ iconv_ilseq_handler HANDLER, const uint32_t *SRC, size_t
+ SRCLEN, size_t *OFFSETS, char *RESULTBUF, size_t *LENGTHP)
+ Converts an entire Unicode string, possibly including NUL units,
+ from UTF-8 encoding to a given encoding.
+
+ Converts a memory region to encoding TOCODE. TOCODE is as for the
+ `iconv_open' function.
+
+ The input is in the memory region between SRC (inclusive) and `SRC
+ + SRCLEN' (exclusive).
+
+ If OFFSETS is not NULL, it should point to an array of SRCLEN
+ integers; this array is filled with offsets into the result, i.e.
+ the character starting at `SRC[i]' corresponds to the character
+ starting at `RESULT[OFFSETS[i]]', and other offsets are set to
+ `(size_t)(-1)'.
+
+ `RESULTBUF' and `*LENGTHP' should be a scratch buffer and its
+ size, or `RESULTBUF' can be NULL.
+
+ May erase the contents of the memory at `RESULTBUF'.
+
+ If successful: The resulting Unicode string (non-NULL) is returned
+ and its length stored in `*LENGTHP'. The resulting string is
+ `RESULTBUF' if no dynamic memory allocation was necessary, or a
+ freshly allocated memory block otherwise.
+
+ In case of error: NULL is returned and `errno' is set. Particular
+ `errno' values: `EINVAL', `EILSEQ', `ENOMEM'.
+
+ The following functions convert between NUL terminated strings in a
+specified encoding and NUL terminated Unicode strings.
+
+ -- Function: uint8_t * u8_strconv_from_encoding (const char *STRING,
+ const char *FROMCODE, enum iconv_ilseq_handler HANDLER)
+ -- Function: uint16_t * u16_strconv_from_encoding (const char *STRING,
+ const char *FROMCODE, enum iconv_ilseq_handler HANDLER)
+ -- Function: uint32_t * u32_strconv_from_encoding (const char *STRING,
+ const char *FROMCODE, enum iconv_ilseq_handler HANDLER)
+ Converts a NUL terminated string from a given encoding.
+
+ The result is `malloc' allocated, or NULL (with ERRNO set) in case
+ of error.
+
+ Particular `errno' values: `EILSEQ', `ENOMEM'.
+
+ -- Function: char * u8_strconv_to_encoding (const uint8_t *STRING,
+ const char *TOCODE, enum iconv_ilseq_handler HANDLER)
+ -- Function: char * u16_strconv_to_encoding (const uint16_t *STRING,
+ const char *TOCODE, enum iconv_ilseq_handler HANDLER)
+ -- Function: char * u32_strconv_to_encoding (const uint32_t *STRING,
+ const char *TOCODE, enum iconv_ilseq_handler HANDLER)
+ Converts a NUL terminated string to a given encoding.
+
+ The result is `malloc' allocated, or NULL (with `errno' set) in
+ case of error.
+
+ Particular `errno' values: `EILSEQ', `ENOMEM'.
+
+ The following functions are shorthands that convert between NUL
+terminated strings in locale encoding and NUL terminated Unicode
+strings.
+
+ -- Function: uint8_t * u8_strconv_from_locale (const char *STRING)
+ -- Function: uint16_t * u16_strconv_from_locale (const char *STRING)
+ -- Function: uint32_t * u32_strconv_from_locale (const char *STRING)
+ Converts a NUL terminated string from the locale encoding.
+
+ The result is `malloc' allocated, or NULL (with `errno' set) in
+ case of error.
+
+ Particular `errno' values: `ENOMEM'.
+
+ -- Function: char * u8_strconv_to_locale (const uint8_t *STRING)
+ -- Function: char * u16_strconv_to_locale (const uint16_t *STRING)
+ -- Function: char * u32_strconv_to_locale (const uint32_t *STRING)
+ Converts a NUL terminated string to the locale encoding.
+
+ The result is `malloc' allocated, or NULL (with `errno' set) in
+ case of error.
+
+ Particular `errno' values: `ENOMEM'.
+
+
+File: libunistring.info, Node: unistdio.h, Next: uniname.h, Prev: uniconv.h, Up: Top
+
+6 Output with Unicode strings `<unistdio.h>'
+********************************************
+
+ This include file declares functions for doing formatted output with
+Unicode strings. It defines a set of functions similar to `fprintf' and
+`sprintf', which are declared in `<stdio.h>'.
+
+ These functions work like the `printf' function family. In the
+format string:
+ * The format directive `U' takes an UTF-8 string (`const uint8_t *').
+
+ * The format directive `lU' takes an UTF-16 string (`const uint16_t
+ *').
+
+ * The format directive `llU' takes an UTF-32 string (`const uint32_t
+ *').
+
+ A function name with an infix `v' indicates that a `va_list' is
+passed instead of multiple arguments.
+
+ The functions `*sprintf' have a BUF argument that is assumed to be
+large enough. (_DANGEROUS! Overflowing the buffer will crash the
+program._)
+
+ The functions `*snprintf' have a BUF argument that is assumed to be
+SIZE units large. (_DANGEROUS! The resulting string might be
+truncated in the middle of a multibyte character._)
+
+ The functions `*asprintf' have a RESULTP argument. The result will
+be freshly allocated and stored in `*resultp'.
+
+ The functions `*asnprintf' have a (RESULTBUF, LENGTHP) argument
+pair. If RESULTBUF is not NULL and the result fits into `*LENGTHP'
+units, it is put in RESULTBUF, and RESULTBUF is returned. Otherwise, a
+freshly allocated string is returned. In both cases, `*LENGTHP' is set
+to the length (number of units) of the returned string. In case of
+error, NULL is returned and `errno' is set.
+
+ The following functions take an ASCII format string and return a
+result that is a `char *' string in locale encoding.
+
+ -- Function: int ulc_sprintf (char *BUF, const char *FORMAT, ...)
+
+ -- Function: int ulc_snprintf (char *BUF, size_t size, const char
+ *FORMAT, ...)
+
+ -- Function: int ulc_asprintf (char **RESULTP, const char *FORMAT, ...)
+
+ -- Function: char * ulc_asnprintf (char *RESULTBUF, size_t *LENGTHP,
+ const char *FORMAT, ...)
+
+ -- Function: int ulc_vsprintf (char *BUF, const char *FORMAT, va_list
+ AP)
+
+ -- Function: int ulc_vsnprintf (char *BUF, size_t size, const char
+ *FORMAT, va_list AP)
+
+ -- Function: int ulc_vasprintf (char **RESULTP, const char *FORMAT,
+ va_list AP)
+
+ -- Function: char * ulc_vasnprintf (char *RESULTBUF, size_t *LENGTHP,
+ const char *FORMAT, va_list AP)
+
+ The following functions take an ASCII format string and return a
+result in UTF-8 format.
+
+ -- Function: int u8_sprintf (uint8_t *BUF, const char *FORMAT, ...)
+
+ -- Function: int u8_snprintf (uint8_t *BUF, size_t SIZE, const char
+ *FORMAT, ...)
+
+ -- Function: int u8_asprintf (uint8_t **RESULTP, const char *FORMAT,
+ ...)
+
+ -- Function: uint8_t * u8_asnprintf (uint8_t *RESULTBUF, size_t
+ *LENGTHP, const char *FORMAT, ...)
+
+ -- Function: int u8_vsprintf (uint8_t *BUF, const char *FORMAT,
+ va_list ap)
+
+ -- Function: int u8_vsnprintf (uint8_t *BUF, size_t SIZE, const char
+ *FORMAT, va_list AP)
+
+ -- Function: int u8_vasprintf (uint8_t **RESULTP, const char *FORMAT,
+ va_list AP)
+
+ -- Function: uint8_t * u8_vasnprintf (uint8_t *resultbuf, size_t
+ *LENGTHP, const char *FORMAT, va_list AP)
+
+ The following functions take an UTF-8 format string and return a
+result in UTF-8 format.
+
+ -- Function: int u8_u8_sprintf (uint8_t *BUF, const uint8_t *FORMAT,
+ ...)
+
+ -- Function: int u8_u8_snprintf (uint8_t *BUF, size_t SIZE, const
+ uint8_t *FORMAT, ...)
+
+ -- Function: int u8_u8_asprintf (uint8_t **RESULTP, const uint8_t
+ *FORMAT, ...)
+
+ -- Function: uint8_t * u8_u8_asnprintf (uint8_t *resultbuf, size_t
+ *LENGTHP, const uint8_t *FORMAT, ...)
+
+ -- Function: int u8_u8_vsprintf (uint8_t *BUF, const uint8_t *FORMAT,
+ va_list AP)
+
+ -- Function: int u8_u8_vsnprintf (uint8_t *BUF, size_t SIZE, const
+ uint8_t *FORMAT, va_list AP)
+
+ -- Function: int u8_u8_vasprintf (uint8_t **RESULTP, const uint8_t
+ *FORMAT, va_list AP)
+
+ -- Function: uint8_t * u8_u8_vasnprintf (uint8_t *resultbuf, size_t
+ *LENGTHP, const uint8_t *FORMAT, va_list AP)
+
+ The following functions take an ASCII format string and return a
+result in UTF-16 format.
+
+ -- Function: int u16_sprintf (uint16_t *BUF, const char *FORMAT, ...)
+
+ -- Function: int u16_snprintf (uint16_t *BUF, size_t SIZE, const char
+ *FORMAT, ...)
+
+ -- Function: int u16_asprintf (uint16_t **RESULTP, const char *FORMAT,
+ ...)
+
+ -- Function: uint16_t * u16_asnprintf (uint16_t *RESULTBUF, size_t
+ *LENGTHP, const char *FORMAT, ...)
+
+ -- Function: int u16_vsprintf (uint16_t *BUF, const char *FORMAT,
+ va_list ap)
+
+ -- Function: int u16_vsnprintf (uint16_t *BUF, size_t SIZE, const char
+ *FORMAT, va_list AP)
+
+ -- Function: int u16_vasprintf (uint16_t **RESULTP, const char
+ *FORMAT, va_list AP)
+
+ -- Function: uint16_t * u16_vasnprintf (uint16_t *resultbuf, size_t
+ *LENGTHP, const char *FORMAT, va_list AP)
+
+ The following functions take an UTF-16 format string and return a
+result in UTF-16 format.
+
+ -- Function: int u16_u16_sprintf (uint16_t *BUF, const uint16_t
+ *FORMAT, ...)
+
+ -- Function: int u16_u16_snprintf (uint16_t *BUF, size_t SIZE, const
+ uint16_t *FORMAT, ...)
+
+ -- Function: int u16_u16_asprintf (uint16_t **RESULTP, const uint16_t
+ *FORMAT, ...)
+
+ -- Function: uint16_t * u16_u16_asnprintf (uint16_t *resultbuf, size_t
+ *LENGTHP, const uint16_t *FORMAT, ...)
+
+ -- Function: int u16_u16_vsprintf (uint16_t *BUF, const uint16_t
+ *FORMAT, va_list AP)
+
+ -- Function: int u16_u16_vsnprintf (uint16_t *BUF, size_t SIZE, const
+ uint16_t *FORMAT, va_list AP)
+
+ -- Function: int u16_u16_vasprintf (uint16_t **RESULTP, const uint16_t
+ *FORMAT, va_list AP)
+
+ -- Function: uint16_t * u16_u16_vasnprintf (uint16_t *resultbuf,
+ size_t *LENGTHP, const uint16_t *FORMAT, va_list AP)
+
+ The following functions take an ASCII format string and return a
+result in UTF-32 format.
+
+ -- Function: int u32_sprintf (uint32_t *BUF, const char *FORMAT, ...)
+
+ -- Function: int u32_snprintf (uint32_t *BUF, size_t SIZE, const char
+ *FORMAT, ...)
+
+ -- Function: int u32_asprintf (uint32_t **RESULTP, const char *FORMAT,
+ ...)
+
+ -- Function: uint32_t * u32_asnprintf (uint32_t *RESULTBUF, size_t
+ *LENGTHP, const char *FORMAT, ...)
+
+ -- Function: int u32_vsprintf (uint32_t *BUF, const char *FORMAT,
+ va_list ap)
+
+ -- Function: int u32_vsnprintf (uint32_t *BUF, size_t SIZE, const char
+ *FORMAT, va_list AP)
+
+ -- Function: int u32_vasprintf (uint32_t **RESULTP, const char
+ *FORMAT, va_list AP)
+
+ -- Function: uint32_t * u32_vasnprintf (uint32_t *resultbuf, size_t
+ *LENGTHP, const char *FORMAT, va_list AP)
+
+ The following functions take an UTF-32 format string and return a
+result in UTF-32 format.
+
+ -- Function: int u32_u32_sprintf (uint32_t *BUF, const uint32_t
+ *FORMAT, ...)
+
+ -- Function: int u32_u32_snprintf (uint32_t *BUF, size_t SIZE, const
+ uint32_t *FORMAT, ...)
+
+ -- Function: int u32_u32_asprintf (uint32_t **RESULTP, const uint32_t
+ *FORMAT, ...)
+
+ -- Function: uint32_t * u32_u32_asnprintf (uint32_t *resultbuf, size_t
+ *LENGTHP, const uint32_t *FORMAT, ...)
+
+ -- Function: int u32_u32_vsprintf (uint32_t *BUF, const uint32_t
+ *FORMAT, va_list AP)
+
+ -- Function: int u32_u32_vsnprintf (uint32_t *BUF, size_t SIZE, const
+ uint32_t *FORMAT, va_list AP)
+
+ -- Function: int u32_u32_vasprintf (uint32_t **RESULTP, const uint32_t
+ *FORMAT, va_list AP)
+
+ -- Function: uint32_t * u32_u32_vasnprintf (uint32_t *resultbuf,
+ size_t *LENGTHP, const uint32_t *FORMAT, va_list AP)
+
+ The following functions take an ASCII format string and produce
+output in locale encoding to a `FILE' stream.
+
+ -- Function: int ulc_fprintf (FILE *STREAM, const char *FORMAT, ...)
+
+ -- Function: int ulc_vfprintf (FILE *STREAM, const char *FORMAT,
+ va_list AP)
+
+
+File: libunistring.info, Node: uniname.h, Next: unictype.h, Prev: unistdio.h, Up: Top
+
+7 Names of Unicode characters `<uniname.h>'
+*******************************************
+
+ This include file implements the association between a Unicode
+character and its name.
+
+ The name of a Unicode character allows to distinguish it from other,
+similar looking characters. For example, the character `x' has the name
+`"LATIN SMALL LETTER X"' and is therefore different from the character
+named `"MULTIPLICATION SIGN"'.
+
+ -- Macro: unsigned int UNINAME_MAX
+ This macro expands to a constant that is the required size of
+ buffer for a Unicode character name.
+
+ -- Function: char * unicode_character_name (ucs4_t UC, char *BUF)
+ Looks up the name of a Unicode character, in uppercase ASCII. BUF
+ must point to a buffer, at least `UNINAME_MAX' bytes in size.
+ Returns the filled BUF, or NULL if the character does not have a
+ name.
+
+ -- Function: ucs4_t unicode_name_character (const char *NAME)
+ Looks up the Unicode character with a given name, in upper- or
+ lowercase ASCII. Returns the character if found, or
+ `UNINAME_INVALID' if not found.
+
+ -- Macro: ucs4_t UNINAME_INVALID
+ This macro expands to a constant that is a special return value of
+ the `unicode_name_character' function.
+
+
+File: libunistring.info, Node: unictype.h, Next: uniwidth.h, Prev: uniname.h, Up: Top
+
+8 Unicode character classification and properties `<unictype.h>'
+****************************************************************
+
+ This include file declares functions that classify Unicode characters
+and that test whether Unicode characters have specific properties.
+
+ The classification assigns a "general category" to every Unicode
+character. This is similar to the classification provided by ISO C in
+`<wctype.h>'.
+
+ Properties are the data that guides various text processing
+algorithms in the presence of specific Unicode characters.
+
+* Menu:
+
+* General category::
+* Canonical combining class::
+* Bidirectional category::
+* Decimal digit value::
+* Digit value::
+* Numeric value::
+* Mirrored character::
+* Properties::
+* Scripts::
+* Blocks::
+* ISO C and Java syntax::
+* Classifications like in ISO C::
+
+
+File: libunistring.info, Node: General category, Next: Canonical combining class, Up: unictype.h
+
+8.1 General category
+====================
+
+ Every Unicode character or code point has a _general category_
+assigned to it. This classification is important for most algorithms
+that work on Unicode text.
+
+ The GNU libunistring library provides two kinds of API for working
+with general categories. The object oriented API uses a variable to
+denote every predefined general category value or combinations thereof.
+The low-level API uses a bit mask instead. The advantage of the object
+oriented API is that if only a few predefined general category values
+are used, the data tables are relatively small. When you combine
+general category values (using `uc_general_category_or',
+`uc_general_category_and', or `uc_general_category_and_not'), or when
+you use the low level bit masks, a big table is used thats holds the
+complete general category information for all Unicode characters.
+
+* Menu:
+
+* Object oriented API::
+* Bit mask API::
+
+
+File: libunistring.info, Node: Object oriented API, Next: Bit mask API, Up: General category
+
+8.1.1 The object oriented API for general category
+--------------------------------------------------
+
+ -- Type: uc_general_category_t
+ This data type denotes a general category value. It is an
+ immediate type that can be copied by simple assignment, without
+ involving memory allocation. It is not an array type.
+
+ The following are the predefined general category value. Additional
+general categories may be added in the future.
+
+ -- Constant: uc_general_category_t UC_CATEGORY_L
+ -- Constant: uc_general_category_t UC_CATEGORY_Lu
+ -- Constant: uc_general_category_t UC_CATEGORY_Ll
+ -- Constant: uc_general_category_t UC_CATEGORY_Lt
+ -- Constant: uc_general_category_t UC_CATEGORY_Lm
+ -- Constant: uc_general_category_t UC_CATEGORY_Lo
+ -- Constant: uc_general_category_t UC_CATEGORY_M
+ -- Constant: uc_general_category_t UC_CATEGORY_Mn
+ -- Constant: uc_general_category_t UC_CATEGORY_Mc
+ -- Constant: uc_general_category_t UC_CATEGORY_Me
+ -- Constant: uc_general_category_t UC_CATEGORY_N
+ -- Constant: uc_general_category_t UC_CATEGORY_Nd
+ -- Constant: uc_general_category_t UC_CATEGORY_Nl
+ -- Constant: uc_general_category_t UC_CATEGORY_No
+ -- Constant: uc_general_category_t UC_CATEGORY_P
+ -- Constant: uc_general_category_t UC_CATEGORY_Pc
+ -- Constant: uc_general_category_t UC_CATEGORY_Pd
+ -- Constant: uc_general_category_t UC_CATEGORY_Ps
+ -- Constant: uc_general_category_t UC_CATEGORY_Pe
+ -- Constant: uc_general_category_t UC_CATEGORY_Pi
+ -- Constant: uc_general_category_t UC_CATEGORY_Pf
+ -- Constant: uc_general_category_t UC_CATEGORY_Po
+ -- Constant: uc_general_category_t UC_CATEGORY_S
+ -- Constant: uc_general_category_t UC_CATEGORY_Sm
+ -- Constant: uc_general_category_t UC_CATEGORY_Sc
+ -- Constant: uc_general_category_t UC_CATEGORY_Sk
+ -- Constant: uc_general_category_t UC_CATEGORY_So
+ -- Constant: uc_general_category_t UC_CATEGORY_Z
+ -- Constant: uc_general_category_t UC_CATEGORY_Zs
+ -- Constant: uc_general_category_t UC_CATEGORY_Zl
+ -- Constant: uc_general_category_t UC_CATEGORY_Zp
+ -- Constant: uc_general_category_t UC_CATEGORY_C
+ -- Constant: uc_general_category_t UC_CATEGORY_Cc
+ -- Constant: uc_general_category_t UC_CATEGORY_Cf
+ -- Constant: uc_general_category_t UC_CATEGORY_Cs
+ -- Constant: uc_general_category_t UC_CATEGORY_Co
+ -- Constant: uc_general_category_t UC_CATEGORY_Cn
+
+ The following are alias names for predefined General category values.
+
+ -- Macro: uc_general_category_t UC_LETTER
+ This is another name for `UC_CATEGORY_L'.
+
+ -- Macro: uc_general_category_t UC_UPPERCASE_LETTER
+ This is another name for `UC_CATEGORY_Lu'.
+
+ -- Macro: uc_general_category_t UC_LOWERCASE_LETTER
+ This is another name for `UC_CATEGORY_Ll'.
+
+ -- Macro: uc_general_category_t UC_TITLECASE_LETTER
+ This is another name for `UC_CATEGORY_Lt'.
+
+ -- Macro: uc_general_category_t UC_MODIFIER_LETTER
+ This is another name for `UC_CATEGORY_Lm'.
+
+ -- Macro: uc_general_category_t UC_OTHER_LETTER
+ This is another name for `UC_CATEGORY_Lo'.
+
+ -- Macro: uc_general_category_t UC_MARK
+ This is another name for `UC_CATEGORY_M'.
+
+ -- Macro: uc_general_category_t UC_NON_SPACING_MARK
+ This is another name for `UC_CATEGORY_Mn'.
+
+ -- Macro: uc_general_category_t UC_COMBINING_SPACING_MARK
+ This is another name for `UC_CATEGORY_Mc'.
+
+ -- Macro: uc_general_category_t UC_ENCLOSING_MARK
+ This is another name for `UC_CATEGORY_Me'.
+
+ -- Macro: uc_general_category_t UC_NUMBER
+ This is another name for `UC_CATEGORY_N'.
+
+ -- Macro: uc_general_category_t UC_DECIMAL_DIGIT_NUMBER
+ This is another name for `UC_CATEGORY_Nd'.
+
+ -- Macro: uc_general_category_t UC_LETTER_NUMBER
+ This is another name for `UC_CATEGORY_Nl'.
+
+ -- Macro: uc_general_category_t UC_OTHER_NUMBER
+ This is another name for `UC_CATEGORY_No'.
+
+ -- Macro: uc_general_category_t UC_PUNCTUATION
+ This is another name for `UC_CATEGORY_P'.
+
+ -- Macro: uc_general_category_t UC_CONNECTOR_PUNCTUATION
+ This is another name for `UC_CATEGORY_Pc'.
+
+ -- Macro: uc_general_category_t UC_DASH_PUNCTUATION
+ This is another name for `UC_CATEGORY_Pd'.
+
+ -- Macro: uc_general_category_t UC_OPEN_PUNCTUATION
+ This is another name for `UC_CATEGORY_Ps' ("start punctuation").
+
+ -- Macro: uc_general_category_t UC_CLOSE_PUNCTUATION
+ This is another name for `UC_CATEGORY_Pe' ("end punctuation").
+
+ -- Macro: uc_general_category_t UC_INITIAL_QUOTE_PUNCTUATION
+ This is another name for `UC_CATEGORY_Pi'.
+
+ -- Macro: uc_general_category_t UC_FINAL_QUOTE_PUNCTUATION
+ This is another name for `UC_CATEGORY_Pf'.
+
+ -- Macro: uc_general_category_t UC_OTHER_PUNCTUATION
+ This is another name for `UC_CATEGORY_Po'.
+
+ -- Macro: uc_general_category_t UC_SYMBOL
+ This is another name for `UC_CATEGORY_S'.
+
+ -- Macro: uc_general_category_t UC_MATH_SYMBOL
+ This is another name for `UC_CATEGORY_Sm'.
+
+ -- Macro: uc_general_category_t UC_CURRENCY_SYMBOL
+ This is another name for `UC_CATEGORY_Sc'.
+
+ -- Macro: uc_general_category_t UC_MODIFIER_SYMBOL
+ This is another name for `UC_CATEGORY_Sk'.
+
+ -- Macro: uc_general_category_t UC_OTHER_SYMBOL
+ This is another name for `UC_CATEGORY_So'.
+
+ -- Macro: uc_general_category_t UC_SEPARATOR
+ This is another name for `UC_CATEGORY_Z'.
+
+ -- Macro: uc_general_category_t UC_SPACE_SEPARATOR
+ This is another name for `UC_CATEGORY_Zs'.
+
+ -- Macro: uc_general_category_t UC_LINE_SEPARATOR
+ This is another name for `UC_CATEGORY_Zl'.
+
+ -- Macro: uc_general_category_t UC_PARAGRAPH_SEPARATOR
+ This is another name for `UC_CATEGORY_Zp'.
+
+ -- Macro: uc_general_category_t UC_OTHER
+ This is another name for `UC_CATEGORY_C'.
+
+ -- Macro: uc_general_category_t UC_CONTROL
+ This is another name for `UC_CATEGORY_Cc'.
+
+ -- Macro: uc_general_category_t UC_FORMAT
+ This is another name for `UC_CATEGORY_Cf'.
+
+ -- Macro: uc_general_category_t UC_SURROGATE
+ This is another name for `UC_CATEGORY_Cs'. All code points in this
+ category are invalid characters.
+
+ -- Macro: uc_general_category_t UC_PRIVATE_USE
+ This is another name for `UC_CATEGORY_Co'.
+
+ -- Macro: uc_general_category_t UC_UNASSIGNED
+ This is another name for `UC_CATEGORY_Cn'. Some code points in
+ this category are invalid characters.
+
+ The following functions combine general categories, like in a
+boolean algebra, except that there is no `not' operation.
+
+ -- Function: uc_general_category_t uc_general_category_or
+ (uc_general_category_t CATEGORY1, uc_general_category_t
+ CATEGORY2)
+ Returns the union of two general categories. This corresponds to
+ the unions of the two sets of characters.
+
+ -- Function: uc_general_category_t uc_general_category_and
+ (uc_general_category_t CATEGORY1, uc_general_category_t
+ CATEGORY2)
+ Returns the intersection of two general categories as bit masks.
+ This _does not_ correspond to the intersection of the two sets of
+ characters.
+
+ -- Function: uc_general_category_t uc_general_category_and_not
+ (uc_general_category_t CATEGORY1, uc_general_category_t
+ CATEGORY2)
+ Returns the intersection of a general category with the complement
+ of a second general category, as bit masks. This _does not_
+ correspond to the intersection with complement, when viewing the
+ categories as sets of characters.
+
+ The following functions associate general categories with their name.
+
+ -- Function: const char * uc_general_category_name
+ (uc_general_category_t CATEGORY)
+ Returns the name of a general category. Returns NULL if the
+ general category corresponds to a bit mask that does not have a
+ name.
+
+ -- Function: uc_general_category_t uc_general_category_byname (const
+ char *CATEGORY_NAME)
+ Returns the general category given by name, e.g. `"Lu"'.
+
+ The following functions view general categories as sets of Unicode
+characters.
+
+ -- Function: uc_general_category_t uc_general_category (ucs4_t UC)
+ Returns the general category of a Unicode character.
+
+ This function uses a big table.
+
+ -- Function: bool uc_is_general_category (ucs4_t UC,
+ uc_general_category_t CATEGORY)
+ Tests whether a Unicode character belongs to a given category.
+ The CATEGORY argument can be a predefined general category or the
+ combination of several predefined general categories.
+
+
+File: libunistring.info, Node: Bit mask API, Prev: Object oriented API, Up: General category
+
+8.1.2 The bit mask API for general category
+-------------------------------------------
+
+ The following are the predefined general category value as bit masks.
+Additional general categories may be added in the future.
+
+ -- Macro: uint32_t UC_CATEGORY_MASK_L
+ -- Macro: uint32_t UC_CATEGORY_MASK_Lu
+ -- Macro: uint32_t UC_CATEGORY_MASK_Ll
+ -- Macro: uint32_t UC_CATEGORY_MASK_Lt
+ -- Macro: uint32_t UC_CATEGORY_MASK_Lm
+ -- Macro: uint32_t UC_CATEGORY_MASK_Lo
+ -- Macro: uint32_t UC_CATEGORY_MASK_M
+ -- Macro: uint32_t UC_CATEGORY_MASK_Mn
+ -- Macro: uint32_t UC_CATEGORY_MASK_Mc
+ -- Macro: uint32_t UC_CATEGORY_MASK_Me
+ -- Macro: uint32_t UC_CATEGORY_MASK_N
+ -- Macro: uint32_t UC_CATEGORY_MASK_Nd
+ -- Macro: uint32_t UC_CATEGORY_MASK_Nl
+ -- Macro: uint32_t UC_CATEGORY_MASK_No
+ -- Macro: uint32_t UC_CATEGORY_MASK_P
+ -- Macro: uint32_t UC_CATEGORY_MASK_Pc
+ -- Macro: uint32_t UC_CATEGORY_MASK_Pd
+ -- Macro: uint32_t UC_CATEGORY_MASK_Ps
+ -- Macro: uint32_t UC_CATEGORY_MASK_Pe
+ -- Macro: uint32_t UC_CATEGORY_MASK_Pi
+ -- Macro: uint32_t UC_CATEGORY_MASK_Pf
+ -- Macro: uint32_t UC_CATEGORY_MASK_Po
+ -- Macro: uint32_t UC_CATEGORY_MASK_S
+ -- Macro: uint32_t UC_CATEGORY_MASK_Sm
+ -- Macro: uint32_t UC_CATEGORY_MASK_Sc
+ -- Macro: uint32_t UC_CATEGORY_MASK_Sk
+ -- Macro: uint32_t UC_CATEGORY_MASK_So
+ -- Macro: uint32_t UC_CATEGORY_MASK_Z
+ -- Macro: uint32_t UC_CATEGORY_MASK_Zs
+ -- Macro: uint32_t UC_CATEGORY_MASK_Zl
+ -- Macro: uint32_t UC_CATEGORY_MASK_Zp
+ -- Macro: uint32_t UC_CATEGORY_MASK_C
+ -- Macro: uint32_t UC_CATEGORY_MASK_Cc
+ -- Macro: uint32_t UC_CATEGORY_MASK_Cf
+ -- Macro: uint32_t UC_CATEGORY_MASK_Cs
+ -- Macro: uint32_t UC_CATEGORY_MASK_Co
+ -- Macro: uint32_t UC_CATEGORY_MASK_Cn
+
+ The following function views general categories as sets of Unicode
+characters.
+
+ -- Function: bool uc_is_general_category_withtable (ucs4_t UC,
+ uint32_t BITMASK)
+ Tests whether a Unicode character belongs to a given category.
+ The BITMASK argument can be a predefined general category bitmask
+ or the combination of several predefined general category bitmasks.
+
+ This function uses a big table comprising all general categories.
+
+
+File: libunistring.info, Node: Canonical combining class, Next: Bidirectional category, Prev: General category, Up: unictype.h
+
+8.2 Canonical combining class
+=============================
+
+ Every Unicode character or code point has a _canonical combining
+class_ assigned to it.
+
+ What is the meaning of the canonical combining class? Essentially,
+it indicates the priority with which a combining character is attached
+to its base character. The characters for which the canonical
+combining class is 0 are the base characters, and the characters for
+which it is greater than 0 are the combining characters. Combining
+characters are rendered near/attached/around their base character, and
+combining characters with small combining classes are attached "first"
+or "closer" to the base character.
+
+ The canonical combining class of a character is a number in the range
+0..255. The possible values are described in the Unicode Character
+Database `http://www.unicode.org/Public/UNIDATA/UCD.html'. The list
+here is not definitive; more values can be added in future versions.
+
+ -- Constant: int UC_CCC_NR
+ The canonical combining class value for "Not Reordered" characters.
+ The value is 0.
+
+ -- Constant: int UC_CCC_OV
+ The canonical combining class value for "Overlay" characters.
+
+ -- Constant: int UC_CCC_NK
+ The canonical combining class value for "Nukta" characters.
+
+ -- Constant: int UC_CCC_KV
+ The canonical combining class value for "Kana Voicing" characters.
+
+ -- Constant: int UC_CCC_VR
+ The canonical combining class value for "Virama" characters.
+
+ -- Constant: int UC_CCC_ATBL
+ The canonical combining class value for "Attached Below Left"
+ characters.
+
+ -- Constant: int UC_CCC_ATB
+ The canonical combining class value for "Attached Below"
+ characters.
+
+ -- Constant: int UC_CCC_ATAR
+ The canonical combining class value for "Attached Above Right"
+ characters.
+
+ -- Constant: int UC_CCC_BL
+ The canonical combining class value for "Below Left" characters.
+
+ -- Constant: int UC_CCC_B
+ The canonical combining class value for "Below" characters.
+
+ -- Constant: int UC_CCC_BR
+ The canonical combining class value for "Below Right" characters.
+
+ -- Constant: int UC_CCC_L
+ The canonical combining class value for "Left" characters.
+
+ -- Constant: int UC_CCC_R
+ The canonical combining class value for "Right" characters.
+
+ -- Constant: int UC_CCC_AL
+ The canonical combining class value for "Above Left" characters.
+
+ -- Constant: int UC_CCC_A
+ The canonical combining class value for "Above" characters.
+
+ -- Constant: int UC_CCC_AR
+ The canonical combining class value for "Above Right" characters.
+
+ -- Constant: int UC_CCC_DB
+ The canonical combining class value for "Double Below" characters.
+
+ -- Constant: int UC_CCC_DA
+ The canonical combining class value for "Double Above" characters.
+
+ -- Constant: int UC_CCC_IS
+ The canonical combining class value for "Iota Subscript"
+ characters.
+
+ The following function looks up the canonical combining class of a
+character.
+
+ -- Function: int uc_combining_class (ucs4_t UC)
+ Returns the canonical combining class of a Unicode character.
+
+
+File: libunistring.info, Node: Bidirectional category, Next: Decimal digit value, Prev: Canonical combining class, Up: unictype.h
+
+8.3 Bidirectional category
+==========================
+
+ Every Unicode character or code point has a _bidirectional category_
+assigned to it.
+
+ The bidirectional category guides the bidirectional algorithm
+(`http://www.unicode.org/reports/tr9/'). The possible values are the
+following.
+
+ -- Constant: int UC_BIDI_L
+ The bidirectional category for `Left-to-Right`" characters.
+
+ -- Constant: int UC_BIDI_LRE
+ The bidirectional category for "Left-to-Right Embedding"
+ characters.
+
+ -- Constant: int UC_BIDI_LRO
+ The bidirectional category for "Left-to-Right Override" characters.
+
+ -- Constant: int UC_BIDI_R
+ The bidirectional category for "Right-to-Left" characters.
+
+ -- Constant: int UC_BIDI_AL
+ The bidirectional category for "Right-to-Left Arabic" characters.
+
+ -- Constant: int UC_BIDI_RLE
+ The bidirectional category for "Right-to-Left Embedding"
+ characters.
+
+ -- Constant: int UC_BIDI_RLO
+ The bidirectional category for "Right-to-Left Override" characters.
+
+ -- Constant: int UC_BIDI_PDF
+ The bidirectional category for "Pop Directional Format" characters.
+
+ -- Constant: int UC_BIDI_EN
+ The bidirectional category for "European Number" characters.
+
+ -- Constant: int UC_BIDI_ES
+ The bidirectional category for "European Number Separator"
+ characters.
+
+ -- Constant: int UC_BIDI_ET
+ The bidirectional category for "European Number Terminator"
+ characters.
+
+ -- Constant: int UC_BIDI_AN
+ The bidirectional category for "Arabic Number" characters.
+
+ -- Constant: int UC_BIDI_CS
+ The bidirectional category for "Common Number Separator"
+ characters.
+
+ -- Constant: int UC_BIDI_NSM
+ The bidirectional category for "Non-Spacing Mark" characters.
+
+ -- Constant: int UC_BIDI_BN
+ The bidirectional category for "Boundary Neutral" characters.
+
+ -- Constant: int UC_BIDI_B
+ The bidirectional category for "Paragraph Separator" characters.
+
+ -- Constant: int UC_BIDI_S
+ The bidirectional category for "Segment Separator" characters.
+
+ -- Constant: int UC_BIDI_WS
+ The bidirectional category for "Whitespace" characters.
+
+ -- Constant: int UC_BIDI_ON
+ The bidirectional category for "Other Neutral" characters.
+
+ The following functions implement the association between a
+bidirectional category and its name.
+
+ -- Function: const char * uc_bidi_category_name (int CATEGORY)
+ Returns the name of a bidirectional category.
+
+ -- Function: int uc_bidi_category_byname (const char *CATEGORY_NAME)
+ Returns the bidirectional category given by name, e.g. `"LRE"'.
+
+ The following functions view bidirectional categories as sets of
+Unicode characters.
+
+ -- Function: int uc_bidi_category (ucs4_t UC)
+ Returns the bidirectional category of a Unicode character.
+
+ -- Function: bool uc_is_bidi_category (ucs4_t UC, int CATEGORY)
+ Tests whether a Unicode character belongs to a given bidirectional
+ category.
+
+
+File: libunistring.info, Node: Decimal digit value, Next: Digit value, Prev: Bidirectional category, Up: unictype.h
+
+8.4 Decimal digit value
+=======================
+
+ Decimal digits (like the digits from `0' to `9') exist in many
+scripts. The following function converts a decimal digit character to
+its numerical value.
+
+ -- Function: int uc_decimal_value (ucs4_t UC)
+ Returns the decimal digit value of a Unicode character. The
+ return value is an integer in the range 0..9, or -1 for characters
+ that do not represent a decimal digit.
+
+
+File: libunistring.info, Node: Digit value, Next: Numeric value, Prev: Decimal digit value, Up: unictype.h
+
+8.5 Digit value
+===============
+
+ Digit characters are like decimal digit characters, possibly in
+special forms, like as superscript, subscript, or circled. The
+following function converts a digit character to its numerical value.
+
+ -- Function: int uc_digit_value (ucs4_t UC)
+ Returns the digit value of a Unicode character. The return value
+ is an integer in the range 0..9, or -1 for characters that do not
+ represent a digit.
+
+
+File: libunistring.info, Node: Numeric value, Next: Mirrored character, Prev: Digit value, Up: unictype.h
+
+8.6 Numeric value
+=================
+
+ There are also characters that represent numbers without a digit
+system, like the Roman numerals, and fractional numbers, like 1/4 or
+3/4.
+
+ The following type represents the numeric value of a Unicode
+character.
+
+ -- Type: uc_fraction_t
+ This is a structure type with the following fields:
+ int numerator;
+ int denominator;
+ An integer N is represented by `numerator = N', `denominator = 1'.
+
+ The following function converts a number character to its numerical
+value.
+
+ -- Function: uc_fraction_t uc_numeric_value (ucs4_t UC)
+ Returns the numeric value of a Unicode character. The return
+ value is a fraction, or the pseudo-fraction `{ 0, 0 }' for
+ characters that do not represent a number.
+
+
+File: libunistring.info, Node: Mirrored character, Next: Properties, Prev: Numeric value, Up: unictype.h
+
+8.7 Mirrored character
+======================
+
+ Character mirroring is used to associate the closing parenthesis
+character to the opening parenthesis character, the closing brace
+character with the opening brace character, and so on.
+
+ The following function looks up the mirrored character of a Unicode
+character.
+
+ -- Function: bool uc_mirror_char (ucs4_t UC, ucs4_t *PUC)
+ Stores the mirrored character of a Unicode character UC in `*PUC'
+ and returns `true', if it exists. Otherwise it stores UC
+ unmodified in `*PUC' and returns `false'.
+
+
+File: libunistring.info, Node: Properties, Next: Scripts, Prev: Mirrored character, Up: unictype.h
+
+8.8 Properties
+==============
+
+ This section defines boolean properties of Unicode characters. This
+means, a character either has the given property or does not have it.
+In other words, the property can be viewed as a subset of the set of
+Unicode characters.
+
+ The GNU libunistring library provides two kinds of API for working
+with properties. The object oriented API uses a type `uc_property_t'
+to designate a property. In the function-based API, which is a bit more
+low level, a property is merely a function.
+
+* Menu:
+
+* Properties as objects::
+* Properties as functions::
+
+
+File: libunistring.info, Node: Properties as objects, Next: Properties as functions, Up: Properties
+
+8.8.1 Properties as objects - the object oriented API
+-----------------------------------------------------
+
+ The following type designates a property on Unicode characters.
+
+ -- Type: uc_property_t
+ This data type denotes a boolean property on Unicode characters.
+ It is an immediate type that can be copied by simple assignment,
+ without involving memory allocation. It is not an array type.
+
+ Many Unicode properties are predefined.
+
+ The following are general properties.
+
+ -- Constant: uc_property_t UC_PROPERTY_WHITE_SPACE
+ -- Constant: uc_property_t UC_PROPERTY_ALPHABETIC
+ -- Constant: uc_property_t UC_PROPERTY_OTHER_ALPHABETIC
+ -- Constant: uc_property_t UC_PROPERTY_NOT_A_CHARACTER
+ -- Constant: uc_property_t UC_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT
+ -- Constant: uc_property_t
+UC_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT
+ -- Constant: uc_property_t UC_PROPERTY_DEPRECATED
+ -- Constant: uc_property_t UC_PROPERTY_LOGICAL_ORDER_EXCEPTION
+ -- Constant: uc_property_t UC_PROPERTY_VARIATION_SELECTOR
+ -- Constant: uc_property_t UC_PROPERTY_PRIVATE_USE
+ -- Constant: uc_property_t UC_PROPERTY_UNASSIGNED_CODE_VALUE
+
+ The following properties are related to case folding.
+
+ -- Constant: uc_property_t UC_PROPERTY_UPPERCASE
+ -- Constant: uc_property_t UC_PROPERTY_OTHER_UPPERCASE
+ -- Constant: uc_property_t UC_PROPERTY_LOWERCASE
+ -- Constant: uc_property_t UC_PROPERTY_OTHER_LOWERCASE
+ -- Constant: uc_property_t UC_PROPERTY_TITLECASE
+ -- Constant: uc_property_t UC_PROPERTY_SOFT_DOTTED
+
+ The following properties are related to identifiers.
+
+ -- Constant: uc_property_t UC_PROPERTY_ID_START
+ -- Constant: uc_property_t UC_PROPERTY_OTHER_ID_START
+ -- Constant: uc_property_t UC_PROPERTY_ID_CONTINUE
+ -- Constant: uc_property_t UC_PROPERTY_OTHER_ID_CONTINUE
+ -- Constant: uc_property_t UC_PROPERTY_XID_START
+ -- Constant: uc_property_t UC_PROPERTY_XID_CONTINUE
+ -- Constant: uc_property_t UC_PROPERTY_PATTERN_WHITE_SPACE
+ -- Constant: uc_property_t UC_PROPERTY_PATTERN_SYNTAX
+
+ The following properties have an influence on shaping and rendering.
+
+ -- Constant: uc_property_t UC_PROPERTY_JOIN_CONTROL
+ -- Constant: uc_property_t UC_PROPERTY_GRAPHEME_BASE
+ -- Constant: uc_property_t UC_PROPERTY_GRAPHEME_EXTEND
+ -- Constant: uc_property_t UC_PROPERTY_OTHER_GRAPHEME_EXTEND
+ -- Constant: uc_property_t UC_PROPERTY_GRAPHEME_LINK
+
+ The following properties relate to bidirectional reordering.
+
+ -- Constant: uc_property_t UC_PROPERTY_BIDI_CONTROL
+ -- Constant: uc_property_t UC_PROPERTY_BIDI_LEFT_TO_RIGHT
+ -- Constant: uc_property_t UC_PROPERTY_BIDI_HEBREW_RIGHT_TO_LEFT
+ -- Constant: uc_property_t UC_PROPERTY_BIDI_ARABIC_RIGHT_TO_LEFT
+ -- Constant: uc_property_t UC_PROPERTY_BIDI_EUROPEAN_DIGIT
+ -- Constant: uc_property_t UC_PROPERTY_BIDI_EUR_NUM_SEPARATOR
+ -- Constant: uc_property_t UC_PROPERTY_BIDI_EUR_NUM_TERMINATOR
+ -- Constant: uc_property_t UC_PROPERTY_BIDI_ARABIC_DIGIT
+ -- Constant: uc_property_t UC_PROPERTY_BIDI_COMMON_SEPARATOR
+ -- Constant: uc_property_t UC_PROPERTY_BIDI_BLOCK_SEPARATOR
+ -- Constant: uc_property_t UC_PROPERTY_BIDI_SEGMENT_SEPARATOR
+ -- Constant: uc_property_t UC_PROPERTY_BIDI_WHITESPACE
+ -- Constant: uc_property_t UC_PROPERTY_BIDI_NON_SPACING_MARK
+ -- Constant: uc_property_t UC_PROPERTY_BIDI_BOUNDARY_NEUTRAL
+ -- Constant: uc_property_t UC_PROPERTY_BIDI_PDF
+ -- Constant: uc_property_t UC_PROPERTY_BIDI_EMBEDDING_OR_OVERRIDE
+ -- Constant: uc_property_t UC_PROPERTY_BIDI_OTHER_NEUTRAL
+
+ The following properties deal with number representations.
+
+ -- Constant: uc_property_t UC_PROPERTY_HEX_DIGIT
+ -- Constant: uc_property_t UC_PROPERTY_ASCII_HEX_DIGIT
+
+ The following properties deal with CJK.
+
+ -- Constant: uc_property_t UC_PROPERTY_IDEOGRAPHIC
+ -- Constant: uc_property_t UC_PROPERTY_UNIFIED_IDEOGRAPH
+ -- Constant: uc_property_t UC_PROPERTY_RADICAL
+ -- Constant: uc_property_t UC_PROPERTY_IDS_BINARY_OPERATOR
+ -- Constant: uc_property_t UC_PROPERTY_IDS_TRINARY_OPERATOR
+
+ Other miscellaneous properties are:
+
+ -- Constant: uc_property_t UC_PROPERTY_ZERO_WIDTH
+ -- Constant: uc_property_t UC_PROPERTY_SPACE
+ -- Constant: uc_property_t UC_PROPERTY_NON_BREAK
+ -- Constant: uc_property_t UC_PROPERTY_ISO_CONTROL
+ -- Constant: uc_property_t UC_PROPERTY_FORMAT_CONTROL
+ -- Constant: uc_property_t UC_PROPERTY_DASH
+ -- Constant: uc_property_t UC_PROPERTY_HYPHEN
+ -- Constant: uc_property_t UC_PROPERTY_PUNCTUATION
+ -- Constant: uc_property_t UC_PROPERTY_LINE_SEPARATOR
+ -- Constant: uc_property_t UC_PROPERTY_PARAGRAPH_SEPARATOR
+ -- Constant: uc_property_t UC_PROPERTY_QUOTATION_MARK
+ -- Constant: uc_property_t UC_PROPERTY_SENTENCE_TERMINAL
+ -- Constant: uc_property_t UC_PROPERTY_TERMINAL_PUNCTUATION
+ -- Constant: uc_property_t UC_PROPERTY_CURRENCY_SYMBOL
+ -- Constant: uc_property_t UC_PROPERTY_MATH
+ -- Constant: uc_property_t UC_PROPERTY_OTHER_MATH
+ -- Constant: uc_property_t UC_PROPERTY_PAIRED_PUNCTUATION
+ -- Constant: uc_property_t UC_PROPERTY_LEFT_OF_PAIR
+ -- Constant: uc_property_t UC_PROPERTY_COMBINING
+ -- Constant: uc_property_t UC_PROPERTY_COMPOSITE
+ -- Constant: uc_property_t UC_PROPERTY_DECIMAL_DIGIT
+ -- Constant: uc_property_t UC_PROPERTY_NUMERIC
+ -- Constant: uc_property_t UC_PROPERTY_DIACRITIC
+ -- Constant: uc_property_t UC_PROPERTY_EXTENDER
+ -- Constant: uc_property_t UC_PROPERTY_IGNORABLE_CONTROL
+
+ The following function looks up a property by its name.
+
+ -- Function: uc_property_t uc_property_byname (const char
+ *PROPERTY_NAME)
+ Returns the property given by name, e.g. `"White space"'. If a
+ property with the given name exists, the result will satisfy the
+ `uc_property_is_valid' predicate. Otherwise the result will not
+ satisfy this predicate and must not be passed to functions that
+ expect an `uc_property_t' argument.
+
+ This function references a big table of all predefined properties.
+ Its use can significantly increase the size of your application.
+
+ -- Function: bool uc_property_is_valid (uc_property_t property)
+ Returns `true' when the given property is valid, or `false'
+ otherwise.
+
+ The following function views a property as a set of Unicode
+characters.
+
+ -- Function: bool uc_is_property (ucs4_t UC, uc_property_t PROPERTY)
+ Tests whether the Unicode character UC has the given property.
+
+
+File: libunistring.info, Node: Properties as functions, Prev: Properties as objects, Up: Properties
+
+8.8.2 Properties as functions - the functional API
+--------------------------------------------------
+
+ The following are general properties.
+
+ -- Function: bool uc_is_property_white_space (ucs4_t UC)
+ -- Function: bool uc_is_property_alphabetic (ucs4_t UC)
+ -- Function: bool uc_is_property_other_alphabetic (ucs4_t UC)
+ -- Function: bool uc_is_property_not_a_character (ucs4_t UC)
+ -- Function: bool uc_is_property_default_ignorable_code_point (ucs4_t
+ UC)
+ -- Function: bool uc_is_property_other_default_ignorable_code_point
+ (ucs4_t UC)
+ -- Function: bool uc_is_property_deprecated (ucs4_t UC)
+ -- Function: bool uc_is_property_logical_order_exception (ucs4_t UC)
+ -- Function: bool uc_is_property_variation_selector (ucs4_t UC)
+ -- Function: bool uc_is_property_private_use (ucs4_t UC)
+ -- Function: bool uc_is_property_unassigned_code_value (ucs4_t UC)
+
+ The following properties are related to case folding.
+
+ -- Function: bool uc_is_property_uppercase (ucs4_t UC)
+ -- Function: bool uc_is_property_other_uppercase (ucs4_t UC)
+ -- Function: bool uc_is_property_lowercase (ucs4_t UC)
+ -- Function: bool uc_is_property_other_lowercase (ucs4_t UC)
+ -- Function: bool uc_is_property_titlecase (ucs4_t UC)
+ -- Function: bool uc_is_property_soft_dotted (ucs4_t UC)
+
+ The following properties are related to identifiers.
+
+ -- Function: bool uc_is_property_id_start (ucs4_t UC)
+ -- Function: bool uc_is_property_other_id_start (ucs4_t UC)
+ -- Function: bool uc_is_property_id_continue (ucs4_t UC)
+ -- Function: bool uc_is_property_other_id_continue (ucs4_t UC)
+ -- Function: bool uc_is_property_xid_start (ucs4_t UC)
+ -- Function: bool uc_is_property_xid_continue (ucs4_t UC)
+ -- Function: bool uc_is_property_pattern_white_space (ucs4_t UC)
+ -- Function: bool uc_is_property_pattern_syntax (ucs4_t UC)
+
+ The following properties have an influence on shaping and rendering.
+
+ -- Function: bool uc_is_property_join_control (ucs4_t UC)
+ -- Function: bool uc_is_property_grapheme_base (ucs4_t UC)
+ -- Function: bool uc_is_property_grapheme_extend (ucs4_t UC)
+ -- Function: bool uc_is_property_other_grapheme_extend (ucs4_t UC)
+ -- Function: bool uc_is_property_grapheme_link (ucs4_t UC)
+
+ The following properties relate to bidirectional reordering.
+
+ -- Function: bool uc_is_property_bidi_control (ucs4_t UC)
+ -- Function: bool uc_is_property_bidi_left_to_right (ucs4_t UC)
+ -- Function: bool uc_is_property_bidi_hebrew_right_to_left (ucs4_t UC)
+ -- Function: bool uc_is_property_bidi_arabic_right_to_left (ucs4_t UC)
+ -- Function: bool uc_is_property_bidi_european_digit (ucs4_t UC)
+ -- Function: bool uc_is_property_bidi_eur_num_separator (ucs4_t UC)
+ -- Function: bool uc_is_property_bidi_eur_num_terminator (ucs4_t UC)
+ -- Function: bool uc_is_property_bidi_arabic_digit (ucs4_t UC)
+ -- Function: bool uc_is_property_bidi_common_separator (ucs4_t UC)
+ -- Function: bool uc_is_property_bidi_block_separator (ucs4_t UC)
+ -- Function: bool uc_is_property_bidi_segment_separator (ucs4_t UC)
+ -- Function: bool uc_is_property_bidi_whitespace (ucs4_t UC)
+ -- Function: bool uc_is_property_bidi_non_spacing_mark (ucs4_t UC)
+ -- Function: bool uc_is_property_bidi_boundary_neutral (ucs4_t UC)
+ -- Function: bool uc_is_property_bidi_pdf (ucs4_t UC)
+ -- Function: bool uc_is_property_bidi_embedding_or_override (ucs4_t UC)
+ -- Function: bool uc_is_property_bidi_other_neutral (ucs4_t UC)
+
+ The following properties deal with number representations.
+
+ -- Function: bool uc_is_property_hex_digit (ucs4_t UC)
+ -- Function: bool uc_is_property_ascii_hex_digit (ucs4_t UC)
+
+ The following properties deal with CJK.
+
+ -- Function: bool uc_is_property_ideographic (ucs4_t UC)
+ -- Function: bool uc_is_property_unified_ideograph (ucs4_t UC)
+ -- Function: bool uc_is_property_radical (ucs4_t UC)
+ -- Function: bool uc_is_property_ids_binary_operator (ucs4_t UC)
+ -- Function: bool uc_is_property_ids_trinary_operator (ucs4_t UC)
+
+ Other miscellaneous properties are:
+
+ -- Function: bool uc_is_property_zero_width (ucs4_t UC)
+ -- Function: bool uc_is_property_space (ucs4_t UC)
+ -- Function: bool uc_is_property_non_break (ucs4_t UC)
+ -- Function: bool uc_is_property_iso_control (ucs4_t UC)
+ -- Function: bool uc_is_property_format_control (ucs4_t UC)
+ -- Function: bool uc_is_property_dash (ucs4_t UC)
+ -- Function: bool uc_is_property_hyphen (ucs4_t UC)
+ -- Function: bool uc_is_property_punctuation (ucs4_t UC)
+ -- Function: bool uc_is_property_line_separator (ucs4_t UC)
+ -- Function: bool uc_is_property_paragraph_separator (ucs4_t UC)
+ -- Function: bool uc_is_property_quotation_mark (ucs4_t UC)
+ -- Function: bool uc_is_property_sentence_terminal (ucs4_t UC)
+ -- Function: bool uc_is_property_terminal_punctuation (ucs4_t UC)
+ -- Function: bool uc_is_property_currency_symbol (ucs4_t UC)
+ -- Function: bool uc_is_property_math (ucs4_t UC)
+ -- Function: bool uc_is_property_other_math (ucs4_t UC)
+ -- Function: bool uc_is_property_paired_punctuation (ucs4_t UC)
+ -- Function: bool uc_is_property_left_of_pair (ucs4_t UC)
+ -- Function: bool uc_is_property_combining (ucs4_t UC)
+ -- Function: bool uc_is_property_composite (ucs4_t UC)
+ -- Function: bool uc_is_property_decimal_digit (ucs4_t UC)
+ -- Function: bool uc_is_property_numeric (ucs4_t UC)
+ -- Function: bool uc_is_property_diacritic (ucs4_t UC)
+ -- Function: bool uc_is_property_extender (ucs4_t UC)
+ -- Function: bool uc_is_property_ignorable_control (ucs4_t UC)
+
+
+File: libunistring.info, Node: Scripts, Next: Blocks, Prev: Properties, Up: unictype.h
+
+8.9 Scripts
+===========
+
+ The Unicode characters are subdivided into scripts.
+
+ The following type is used to represent a script:
+
+ -- Type: uc_script_t
+ This data type is a structure type that refers to statically
+ allocated read-only data. It contains the following fields:
+ const char *name;
+
+ The `name' field contains the name of the script.
+
+ The following functions look up a script.
+
+ -- Function: const uc_script_t * uc_script (ucs4_t UC)
+ Returns the script of a Unicode character. Returns NULL if UC
+ does not belong to any script.
+
+ -- Function: const uc_script_t * uc_script_byname (const char
+ *SCRIPT_NAME)
+ Returns the script given by its name, e.g. `"HAN"'. Returns NULL
+ if a script with the given name does not exist.
+
+ The following function views a script as a set of Unicode characters.
+
+ -- Function: bool uc_is_script (ucs4_t UC, const uc_script_t *SCRIPT)
+ Tests whether a Unicode character belongs to a given script.
+
+ The following gives a global picture of all scripts.
+
+ -- Function: void uc_all_scripts (const uc_script_t **SCRIPTS, size_t
+ *COUNT)
+ Get the list of all scripts. Stores a pointer to an array of all
+ scripts in `*SCRIPTS' and the length of this array in `*COUNT'.
+
+
+File: libunistring.info, Node: Blocks, Next: ISO C and Java syntax, Prev: Scripts, Up: unictype.h
+
+8.10 Blocks
+===========
+
+ The Unicode characters are subdivided into blocks. A block is an
+interval of Unicode code points.
+
+ The following type is used to represent a block.
+
+ -- Type: uc_block_t
+ This data type is a structure type that refers to statically
+ allocated data. It contains the following fields:
+ ucs4_t start;
+ ucs4_t end;
+ const char *name;
+
+ The `start' field is the first Unicode code point in the block.
+
+ The `end' field is the last Unicode code point in the block.
+
+ The `name' field is the name of the block.
+
+ The following function looks up a block.
+
+ -- Function: const uc_block_t * uc_block (ucs4_t UC)
+ Returns the block a character belongs to.
+
+ The following function views a block as a set of Unicode characters.
+
+ -- Function: bool uc_is_block (ucs4_t UC, const uc_block_t *BLOCK)
+ Tests whether a Unicode character belongs to a given block.
+
+ The following gives a global picture of all block.
+
+ -- Function: void uc_all_blocks (const uc_block_t **BLOCKS, size_t
+ *COUNT)
+ Get the list of all blocks. Stores a pointer to an array of all
+ blocks in `*BLOCKS' and the length of this array in `*COUNT'.
+
+
+File: libunistring.info, Node: ISO C and Java syntax, Next: Classifications like in ISO C, Prev: Blocks, Up: unictype.h
+
+8.11 ISO C and Java syntax
+==========================
+
+ The following properties are taken from language standards. The
+supported language standards are ISO C 99 and Java.
+
+ -- Function: bool uc_is_c_whitespace (ucs4_t UC)
+ Tests whether a Unicode character is considered whitespace in ISO
+ C 99.
+
+ -- Function: bool uc_is_java_whitespace (ucs4_t UC)
+ Tests whether a Unicode character is considered whitespace in Java.
+
+ The following enumerated values are the possible return values of
+the functions `uc_c_ident_category' and `uc_java_ident_category'.
+
+ -- Constant: int UC_IDENTIFIER_START
+ This return value means that the given character is valid as first
+ or subsequent character in an identifier.
+
+ -- Constant: int UC_IDENTIFIER_VALID
+ This return value means that the given character is valid as
+ subsequent character only.
+
+ -- Constant: int UC_IDENTIFIER_INVALID
+ This return value means that the given character is not valid in
+ an identifier.
+
+ -- Constant: int UC_IDENTIFIER_IGNORABLE
+ This return value (only for Java) means that the given character
+ is ignorable.
+
+ The following function determine whether a given character can be a
+constituent of an identifier in the given programming language.
+
+ -- Function: int uc_c_ident_category (ucs4_t UC)
+ Returns the categorization of a Unicode character with respect to
+ the ISO C 99 identifier syntax.
+
+ -- Function: int uc_java_ident_category (ucs4_t UC)
+ Returns the categorization of a Unicode character with respect to
+ the Java identifier syntax.
+
+
+File: libunistring.info, Node: Classifications like in ISO C, Prev: ISO C and Java syntax, Up: unictype.h
+
+8.12 Classifications like in ISO C
+==================================
+
+ The following character classifications mimic those declared in the
+ISO C header files `<ctype.h>' and `<wctype.h>'. These functions are
+deprecated, because this set of functions was designed with ASCII in
+mind and cannot reflect the more diverse reality of the Unicode
+character set. But they can be a quick-and-dirty porting aid when
+migrating from `wchar_t' APIs to Unicode strings.
+
+ -- Function: bool uc_is_alnum (ucs4_t UC)
+ Tests for any character for which `uc_is_alpha' or `uc_is_digit' is
+ true.
+
+ -- Function: bool uc_is_alpha (ucs4_t UC)
+ Tests for any character for which `uc_is_upper' or `uc_is_lower' is
+ true, or any character that is one of a locale-specific set of
+ characters for which none of `uc_is_cntrl', `uc_is_digit',
+ `uc_is_punct', or `uc_is_space' is true.
+
+ -- Function: bool uc_is_cntrl (ucs4_t UC)
+ Tests for any control character.
+
+ -- Function: bool uc_is_digit (ucs4_t UC)
+ Tests for any character that corresponds to a decimal-digit
+ character.
+
+ -- Function: bool uc_is_graph (ucs4_t UC)
+ Tests for any character for which `uc_is_print' is true and
+ `uc_is_space' is false.
+
+ -- Function: bool uc_is_lower (ucs4_t UC)
+ Tests for any character that corresponds to a lowercase letter or
+ is one of a locale-specific set of characters for which none of
+ `uc_is_cntrl', `uc_is_digit', `uc_is_punct', or `uc_is_space' is
+ true.
+
+ -- Function: bool uc_is_print (ucs4_t UC)
+ Tests for any printing character.
+
+ -- Function: bool uc_is_punct (ucs4_t UC)
+ Tests for any printing character that is one of a locale-specific
+ set of characters for which neither `uc_is_space' nor
+ `uc_is_alnum' is true.
+
+ -- Function: bool uc_is_space (ucs4_t UC)
+ Test for any character that corresponds to a locale-specific set
+ of characters for which none of `uc_is_alnum', `uc_is_graph', or
+ `uc_is_punct' is true.
+
+ -- Function: bool uc_is_upper (ucs4_t UC)
+ Tests for any character that corresponds to an uppercase letter or
+ is one of a locale-specific set of characters for which none of
+ `uc_is_cntrl', `uc_is_digit', `uc_is_punct', or `uc_is_space' is
+ true.
+
+ -- Function: bool uc_is_xdigit (ucs4_t UC)
+ Tests for any character that corresponds to a hexadecimal-digit
+ character.
+
+ -- Function: bool uc_is_blank (ucs4_t UC)
+ Tests for any character that corresponds to a standard blank
+ character or a locale-specific set of characters for which
+ `uc_is_alnum' is false.
+
+
+File: libunistring.info, Node: uniwidth.h, Next: uniwbrk.h, Prev: unictype.h, Up: Top
+
+9 Display width `<uniwidth.h>'
+******************************
+
+ This include file declares functions that return the display width,
+measured in columns, of characters or strings, when output to a device
+that uses non-proportional fonts.
+
+ Note that for some rarely used characters the actual fonts or
+terminal emulators can use a different width. There is no mechanism
+for communicating the display width of characters across a Unix
+pseudo-terminal (tty). Also, there are scripts with complex rendering,
+like the Indic scripts. For these scripts, there is no such concept as
+non-proportional fonts. Therefore the results of these functions
+usually work fine on most scripts and on most characters but can fail
+to represent the actual display width.
+
+ These functions are locale dependent. The ENCODING argument
+identifies the encoding (e.g. `"ISO-8859-2"' for Polish).
+
+ -- Function: int uc_width (ucs4_t UC, const char *ENCODING)
+ Determines and returns the number of column positions required for
+ UC. Returns -1 if UC is a control character that has an influence
+ on the column position when output.
+
+ -- Function: int u8_width (const uint8_t *S, size_t N, const char
+ *ENCODING)
+ -- Function: int u16_width (const uint16_t *S, size_t N, const char
+ *ENCODING)
+ -- Function: int u32_width (const uint32_t *S, size_t N, const char
+ *ENCODING)
+ Determines and returns the number of column positions required for
+ first N units (or fewer if S ends before this) in S. This
+ function ignores control characters in the string.
+
+ -- Function: int u8_strwidth (const uint8_t *S, const char *ENCODING)
+ -- Function: int u16_strwidth (const uint16_t *S, const char *ENCODING)
+ -- Function: int u32_strwidth (const uint32_t *S, const char *ENCODING)
+ Determines and returns the number of column positions required for
+ S. This function ignores control characters in the string.
+
+
+File: libunistring.info, Node: uniwbrk.h, Next: unilbrk.h, Prev: uniwidth.h, Up: Top
+
+10 Word breaks in strings `<uniwbrk.h>'
+***************************************
+
+ This include file declares functions for determining where in a
+string "words" start and end. Here "words" are not necessarily the
+same as entities that can be looked up in dictionaries, but rather
+groups of consecutive characters that should not be split by text
+processing operations.
+
+* Menu:
+
+* Word breaks in a string::
+* Word break property::
+
+
+File: libunistring.info, Node: Word breaks in a string, Next: Word break property, Up: uniwbrk.h
+
+10.1 Word breaks in a string
+============================
+
+ The following functions determine the word breaks in a string.
+
+ -- Function: void u8_wordbreaks (const uint8_t *S, size_t N, char *P)
+ -- Function: void u16_wordbreaks (const uint16_t *S, size_t N, char *P)
+ -- Function: void u32_wordbreaks (const uint32_t *S, size_t N, char *P)
+ -- Function: void ulc_wordbreaks (const char *S, size_t N, char *P)
+ Determines the word break points in S, an array of N units, and
+ stores the result at `P[0..N-1]'.
+ `P[i] = 1'
+ means that there is a word boundary between `S[i-1]' and
+ `S[i]'.
+
+ `P[i] = 0'
+ means that `S[i-1]' and `S[i]' must not be separated.
+ `P[0]' is always set to 0. If an application wants to consider a
+ word break to be present at the beginning of the string (before
+ `S[0]') or at the end of the string (after `S[0..N-1]'), it has to
+ treat these cases explicitly.
+
+
+File: libunistring.info, Node: Word break property, Prev: Word breaks in a string, Up: uniwbrk.h
+
+10.2 Word break property
+========================
+
+ This is a more low-level API. The word break property is a property
+defined in Unicode Standard Annex #29, section "Word Boundaries", see
+`http://www.unicode.org/reports/tr29/#Word_Boundaries'. It is used for
+determining the word breaks in a string.
+
+ The following are the possible values of the word break property.
+More values may be added in the future.
+
+ -- Constant: int WBP_OTHER
+ -- Constant: int WBP_CR
+ -- Constant: int WBP_LF
+ -- Constant: int WBP_NEWLINE
+ -- Constant: int WBP_EXTEND
+ -- Constant: int WBP_FORMAT
+ -- Constant: int WBP_KATAKANA
+ -- Constant: int WBP_ALETTER
+ -- Constant: int WBP_MIDNUMLET
+ -- Constant: int WBP_MIDLETTER
+ -- Constant: int WBP_MIDNUM
+ -- Constant: int WBP_NUMERIC
+ -- Constant: int WBP_EXTENDNUMLET
+
+ The following function looks up the word break property of a
+character.
+
+ -- Function: int uc_wordbreak_property (ucs4_t UC)
+ Returns the Word_Break property of a Unicode character.
+
+
+File: libunistring.info, Node: unilbrk.h, Next: uninorm.h, Prev: uniwbrk.h, Up: Top
+
+11 Line breaking `<unilbrk.h>'
+******************************
+
+ This include file declares functions for determining where in a
+string line breaks could or should be introduced, in order to make the
+displayed string fit into a column of given width.
+
+ These functions are locale dependent. The ENCODING argument
+identifies the encoding (e.g. `"ISO-8859-2"' for Polish).
+
+ The following enumerated values indicate whether, at a given
+position, a line break is possible or not. Given an string S as an
+array `S[0..N-1]' and a position I, the values have the following
+meanings:
+
+ -- Constant: int UC_BREAK_MANDATORY
+ This value indicates that `S[I]' is a line break character.
+
+ -- Constant: int UC_BREAK_POSSIBLE
+ This value indicates that a line break may be inserted between
+ `S[I-1]' and `S[I]'.
+
+ -- Constant: int UC_BREAK_HYPHENATION
+ This value indicates that a hyphen and a line break may be
+ inserted between `S[I-1]' and `S[I]'. But beware of language
+ dependent hyphenation rules.
+
+ -- Constant: int UC_BREAK_PROHIBITED
+ This value indicates that `S[I-1]' and `S[I]' must not be
+ separated.
+
+ -- Constant: int UC_BREAK_UNDEFINED
+ This value is not used as a return value; rather, in the
+ overriding argument of the `u*_width_linebreaks' functions, it
+ indicates the absence of an override.
+
+ The following functions determine the positions at which line breaks
+are possible.
+
+ -- Function: void u8_possible_linebreaks (const uint8_t *S, size_t N,
+ const char *ENCODING, char *P)
+ -- Function: void u16_possible_linebreaks (const uint16_t *S, size_t
+ N, const char *ENCODING, char *P)
+ -- Function: void u32_possible_linebreaks (const uint32_t *S, size_t
+ N, const char *ENCODING, char *P)
+ -- Function: void ulc_possible_linebreaks (const char *S, size_t N,
+ const char *ENCODING, char *P)
+ Determines the line break points in S, and stores the result at
+ `P[0..N-1]'. Every `P[I]' is assigned one of the values
+ `UC_BREAK_MANDATORY', `UC_BREAK_POSSIBLE', `UC_BREAK_HYPHENATION',
+ `UC_BREAK_PROHIBITED'.
+
+ The following functions determine where line breaks should be
+inserted so that each line fits in a given width, when output to a
+device that uses non-proportional fonts.
+
+ -- Function: int u8_width_linebreaks (const uint8_t *S, size_t N, int
+ WIDTH, int START_COLUMN, int AT_END_COLUMNS, const char
+ *OVERRIDE, const char *ENCODING, char *P)
+ -- Function: int u16_width_linebreaks (const uint16_t *S, size_t N,
+ int WIDTH, int START_COLUMN, int AT_END_COLUMNS, const char
+ *OVERRIDE, const char *ENCODING, char *P)
+ -- Function: int u32_width_linebreaks (const uint32_t *S, size_t N,
+ int WIDTH, int START_COLUMN, int AT_END_COLUMNS, const char
+ *OVERRIDE, const char *ENCODING, char *P)
+ -- Function: int ulc_width_linebreaks (const char *S, size_t N, int
+ WIDTH, int START_COLUMN, int AT_END_COLUMNS, const char
+ *OVERRIDE, const char *ENCODING, char *P)
+ Chooses the best line breaks, assuming that every character
+ occupies a width given by the `uc_width' function (see *note
+ uniwidth.h::).
+
+ The string is `S[0..N-1]'.
+
+ The maximum number of columns per line is given as WIDTH. The
+ starting column of the string is given as START_COLUMN. If the
+ algorithm shall keep room after the last piece, this amount of
+ room can be given as AT_END_COLUMNS.
+
+ OVERRIDE is an optional override; if `OVERRIDE[I] !=
+ UC_BREAK_UNDEFINED', `OVERRIDE[I]' takes precedence over `P[I]' as
+ returned by the `u*_possible_linebreaks' function.
+
+ The given ENCODING is used for disambiguating widths in `uc_width'.
+
+ Returns the column after the end of the string, and stores the
+ result at `P[0..N-1]'. Every `P[I]' is assigned one of the values
+ `UC_BREAK_MANDATORY', `UC_BREAK_POSSIBLE', `UC_BREAK_HYPHENATION',
+ `UC_BREAK_PROHIBITED'. Here the value `UC_BREAK_POSSIBLE'
+ indicates that a line break _should_ be inserted.
+
+
+File: libunistring.info, Node: uninorm.h, Next: unicase.h, Prev: unilbrk.h, Up: Top
+
+12 Normalization forms (composition and decomposition) `<uninorm.h>'
+********************************************************************
+
+ This include file defines functions for transforming Unicode strings
+to one of the four normal forms, known as NFC, NFD, NKFC, NFKD. These
+transformations involve decomposition and -- for NFC and NFKC --
+composition of Unicode characters.
+
+* Menu:
+
+* Decomposition of characters::
+* Composition of characters::
+* Normalization of strings::
+* Normalizing comparisons::
+* Normalization of streams::
+
+
+File: libunistring.info, Node: Decomposition of characters, Next: Composition of characters, Up: uninorm.h
+
+12.1 Decomposition of Unicode characters
+========================================
+
+ The following enumerated values are the possible types of
+decomposition of a Unicode character.
+
+ -- Constant: int UC_DECOMP_CANONICAL
+ Denotes canonical decomposition.
+
+ -- Constant: int UC_DECOMP_FONT
+ UCD marker: `<font>'. Denotes a font variant (e.g. a blackletter
+ form).
+
+ -- Constant: int UC_DECOMP_NOBREAK
+ UCD marker: `<noBreak>'. Denotes a no-break version of a space or
+ hyphen.
+
+ -- Constant: int UC_DECOMP_INITIAL
+ UCD marker: `<initial>'. Denotes an initial presentation form
+ (Arabic).
+
+ -- Constant: int UC_DECOMP_MEDIAL
+ UCD marker: `<medial>'. Denotes a medial presentation form
+ (Arabic).
+
+ -- Constant: int UC_DECOMP_FINAL
+ UCD marker: `<final>'. Denotes a final presentation form (Arabic).
+
+ -- Constant: int UC_DECOMP_ISOLATED
+ UCD marker: `<isolated>'. Denotes an isolated presentation form
+ (Arabic).
+
+ -- Constant: int UC_DECOMP_CIRCLE
+ UCD marker: `<circle>'. Denotes an encircled form.
+
+ -- Constant: int UC_DECOMP_SUPER
+ UCD marker: `<super>'. Denotes a superscript form.
+
+ -- Constant: int UC_DECOMP_SUB
+ UCD marker: `<sub>'. Denotes a subscript form.
+
+ -- Constant: int UC_DECOMP_VERTICAL
+ UCD marker: `<vertical>'. Denotes a vertical layout presentation
+ form.
+
+ -- Constant: int UC_DECOMP_WIDE
+ UCD marker: `<wide>'. Denotes a wide (or zenkaku) compatibility
+ character.
+
+ -- Constant: int UC_DECOMP_NARROW
+ UCD marker: `<narrow>'. Denotes a narrow (or hankaku)
+ compatibility character.
+
+ -- Constant: int UC_DECOMP_SMALL
+ UCD marker: `<small>'. Denotes a small variant form (CNS
+ compatibility).
+
+ -- Constant: int UC_DECOMP_SQUARE
+ UCD marker: `<square>'. Denotes a CJK squared font variant.
+
+ -- Constant: int UC_DECOMP_FRACTION
+ UCD marker: `<fraction>'. Denotes a vulgar fraction form.
+
+ -- Constant: int UC_DECOMP_COMPAT
+ UCD marker: `<compat>'. Denotes an otherwise unspecified
+ compatibility character.
+
+ The following constant denotes the maximum size of decomposition of
+a single Unicode character.
+
+ -- Macro: unsigned int UC_DECOMPOSITION_MAX_LENGTH
+ This macro expands to a constant that is the required size of
+ buffer passed to the `uc_decomposition' and
+ `uc_canonical_decomposition' functions.
+
+ The following functions decompose a Unicode character.
+
+ -- Function: int uc_decomposition (ucs4_t UC, int *DECOMP_TAG, ucs4_t
+ *DECOMPOSITION)
+ Returns the character decomposition mapping of the Unicode
+ character UC. DECOMPOSITION must point to an array of at least
+ `UC_DECOMPOSITION_MAX_LENGTH' `ucs_t' elements.
+
+ When a decomposition exists, `DECOMPOSITION[0..N-1]' and
+ `*DECOMP_TAG' are filled and N is returned. Otherwise -1 is
+ returned.
+
+ -- Function: int uc_canonical_decomposition (ucs4_t UC, ucs4_t
+ *DECOMPOSITION)
+ Returns the canonical character decomposition mapping of the
+ Unicode character UC. DECOMPOSITION must point to an array of at
+ least `UC_DECOMPOSITION_MAX_LENGTH' `ucs_t' elements.
+
+ When a decomposition exists, `DECOMPOSITION[0..N-1]' is filled and
+ N is returned. Otherwise -1 is returned.
+
+
+File: libunistring.info, Node: Composition of characters, Next: Normalization of strings, Prev: Decomposition of characters, Up: uninorm.h
+
+12.2 Composition of Unicode characters
+======================================
+
+ The following function composes a Unicode character from two Unicode
+characters.
+
+ -- Function: ucs4_t uc_composition (ucs4_t UC1, ucs4_t UC2)
+ Attempts to combine the Unicode characters UC1, UC2. UC1 is known
+ to have canonical combining class 0.
+
+ Returns the combination of UC1 and UC2, if it exists. Returns 0
+ otherwise.
+
+ Not all decompositions can be recombined using this function. See
+ the Unicode file `CompositionExclusions.txt' for details.
+
+
+File: libunistring.info, Node: Normalization of strings, Next: Normalizing comparisons, Prev: Composition of characters, Up: uninorm.h
+
+12.3 Normalization of strings
+=============================
+
+ The Unicode standard defines four normalization forms for Unicode
+strings. The following type is used to denote a normalization form.
+
+ -- Type: uninorm_t
+ An object of type `uninorm_t' denotes a Unicode normalization form.
+ This is a scalar type; its values can be compared with `=='.
+
+ The following constants denote the four normalization forms.
+
+ -- Macro: uninorm_t UNINORM_NFD
+ Denotes Normalization form D: canonical decomposition.
+
+ -- Macro: uninorm_t UNINORM_NFC
+ Normalization form C: canonical decomposition, then canonical
+ composition.
+
+ -- Macro: uninorm_t UNINORM_NFKD
+ Normalization form KD: compatibility decomposition.
+
+ -- Macro: uninorm_t UNINORM_NFKC
+ Normalization form KC: compatibility decomposition, then canonical
+ composition.
+
+ The following functions operate on `uninorm_t' objects.
+
+ -- Function: bool uninorm_is_compat_decomposing (uninorm_t NF)
+ Tests whether the normalization form NF does compatibility
+ decomposition.
+
+ -- Function: bool uninorm_is_composing (uninorm_t NF)
+ Tests whether the normalization form NF includes canonical
+ composition.
+
+ -- Function: uninorm_t uninorm_decomposing_form (uninorm_t NF)
+ Returns the decomposing variant of the normalization form NF.
+ This maps NFC,NFD -> NFD and NFKC,NFKD -> NFKD.
+
+ The following functions apply a Unicode normalization form to a
+Unicode string.
+
+ -- Function: uint8_t * u8_normalize (uninorm_t NF, const uint8_t *S,
+ size_t N, uint8_t *RESULTBUF, size_t *LENGTHP)
+ -- Function: uint16_t * u16_normalize (uninorm_t NF, const uint16_t
+ *S, size_t N, uint16_t *RESULTBUF, size_t *LENGTHP)
+ -- Function: uint32_t * u32_normalize (uninorm_t NF, const uint32_t
+ *S, size_t N, uint32_t *RESULTBUF, size_t *LENGTHP)
+ Returns the specified normalization form of a string.
+
+
+File: libunistring.info, Node: Normalizing comparisons, Next: Normalization of streams, Prev: Normalization of strings, Up: uninorm.h
+
+12.4 Normalizing comparisons
+============================
+
+ The following functions compare Unicode string, ignoring differences
+in normalization.
+
+ -- Function: int u8_normcmp (const uint8_t *S1, size_t N1, const
+ uint8_t *S2, size_t N2, uninorm_t NF, int *RESULTP)
+ -- Function: int u16_normcmp (const uint16_t *S1, size_t N1, const
+ uint16_t *S2, size_t N2, uninorm_t NF, int *RESULTP)
+ -- Function: int u32_normcmp (const uint32_t *S1, size_t N1, const
+ uint32_t *S2, size_t N2, uninorm_t NF, int *RESULTP)
+ Compares S1 and S2, ignoring differences in normalization.
+
+ NF must be either `UNINORM_NFD' or `UNINORM_NFKD'.
+
+ If successful, sets `*RESULTP' to -1 if S1 < S2, 0 if S1 = S2, 1
+ if S1 > S2, and returns 0. Upon failure, returns -1 with `errno'
+ set.
+
+ -- Function: char * u8_normxfrm (const uint8_t *S, size_t N, uninorm_t
+ NF, char *RESULTBUF, size_t *LENGTHP)
+ -- Function: char * u16_normxfrm (const uint16_t *S, size_t N,
+ uninorm_t NF, char *RESULTBUF, size_t *LENGTHP)
+ -- Function: char * u32_normxfrm (const uint32_t *S, size_t N,
+ uninorm_t NF, char *RESULTBUF, size_t *LENGTHP)
+ Converts the string S of length N to a NUL-terminated byte
+ sequence, in such a way that comparing `u8_normxfrm (S1)' and
+ `u8_normxfrm (S2)' with the `u8_cmp2' function is equivalent to
+ comparing S1 and S2 with the `u8_normcoll' function.
+
+ NF must be either `UNINORM_NFC' or `UNINORM_NFKC'.
+
+ -- Function: int u8_normcoll (const uint8_t *S1, size_t N1, const
+ uint8_t *S2, size_t N2, uninorm_t NF, int *RESULTP)
+ -- Function: int u16_normcoll (const uint16_t *S1, size_t N1, const
+ uint16_t *S2, size_t N2, uninorm_t NF, int *RESULTP)
+ -- Function: int u32_normcoll (const uint32_t *S1, size_t N1, const
+ uint32_t *S2, size_t N2, uninorm_t NF, int *RESULTP)
+ Compares S1 and S2, ignoring differences in normalization, using
+ the collation rules of the current locale.
+
+ NF must be either `UNINORM_NFC' or `UNINORM_NFKC'.
+
+ If successful, sets `*RESULTP' to -1 if S1 < S2, 0 if S1 = S2, 1
+ if S1 > S2, and returns 0. Upon failure, returns -1 with `errno'
+ set.
+
+
+File: libunistring.info, Node: Normalization of streams, Prev: Normalizing comparisons, Up: uninorm.h
+
+12.5 Normalization of streams of Unicode characters
+===================================================
+
+ A "stream of Unicode characters" is essentially a function that
+accepts an `ucs4_t' argument repeatedly, optionally combined with a
+function that "flushes" the stream.
+
+ -- Type: struct uninorm_filter
+ This is the data type of a stream of Unicode characters that
+ normalizes its input according to a given normalization form and
+ passes the normalized character sequence to the encapsulated
+ stream of Unicode characters.
+
+ -- Function: struct uninorm_filter * uninorm_filter_create (uninorm_t
+ NF, int (*STREAM_FUNC) (void *STREAM_DATA, ucs4_t UC), void
+ *STREAM_DATA)
+ Creates and returns a normalization filter for Unicode characters.
+
+ The pair (STREAM_FUNC, STREAM_DATA) is the encapsulated stream.
+ `STREAM_FUNC (STREAM_DATA, UC)' receives the Unicode character UC
+ and returns 0 if successful, or -1 with `errno' set upon failure.
+
+ Returns the new filter, or NULL with `errno' set upon failure.
+
+ -- Function: int uninorm_filter_write (struct uninorm_filter *FILTER,
+ ucs4_t UC)
+ Stuffs a Unicode character into a normalizing filter. Returns 0
+ if successful, or -1 with `errno' set upon failure.
+
+ -- Function: int uninorm_filter_flush (struct uninorm_filter *FILTER)
+ Brings data buffered in the filter to its destination, the
+ encapsulated stream.
+
+ Returns 0 if successful, or -1 with `errno' set upon failure.
+
+ Note! If after calling this function, additional characters are
+ written into the filter, the resulting character sequence in the
+ encapsulated stream will not necessarily be normalized.
+
+ -- Function: int uninorm_filter_free (struct uninorm_filter *FILTER)
+ Brings data buffered in the filter to its destination, the
+ encapsulated stream, then closes and frees the filter.
+
+ Returns 0 if successful, or -1 with `errno' set upon failure.
+
+
+File: libunistring.info, Node: unicase.h, Next: uniregex.h, Prev: uninorm.h, Up: Top
+
+13 Case mappings `<unicase.h>'
+******************************
+
+ This include file defines functions for case mapping for Unicode
+strings and case insensitive comparison of Unicode strings and C
+strings.
+
+ These string functions fix the problems that were mentioned in *note
+char * strings::, namely, they handle the Croatian LETTER DZ WITH
+CARON, the German LATIN SMALL LETTER SHARP S, the Greek sigma and the
+Lithuanian i correctly.
+
+* Menu:
+
+* Case mappings of characters::
+* Case mappings of strings::
+* Case mappings of substrings::
+* Case insensitive comparison::
+* Case detection::
+
+
+File: libunistring.info, Node: Case mappings of characters, Next: Case mappings of strings, Up: unicase.h
+
+13.1 Case mappings of characters
+================================
+
+ The following functions implement case mappings on Unicode
+characters -- for those cases only where the result of the mapping is a
+again a single Unicode character.
+
+ These mappings are locale and context independent.
+
+ *WARNING!* These functions are not sufficient for languages such as
+German, Greek and Lithuanian. Better use the functions below that
+treat an entire string at once and are language aware.
+
+ -- Function: ucs4_t uc_toupper (ucs4_t UC)
+ Returns the uppercase mapping of the Unicode character UC.
+
+ -- Function: ucs4_t uc_tolower (ucs4_t UC)
+ Returns the lowercase mapping of the Unicode character UC.
+
+ -- Function: ucs4_t uc_totitle (ucs4_t UC)
+ Returns the titlecase mapping of the Unicode character UC.
+
+ The titlecase mapping of a character is to be used when the
+ character should look like upper case and the following characters
+ are lower cased.
+
+ For most characters, this is the same as the uppercase mapping.
+ There are only few characters where the title case variant and the
+ uuper case variant are different. These characters occur in the
+ Latin writing of the Croatian, Bosnian, and Serbian languages.
+
+ Lower case Title case Upper case
+ ------------------------------------------------------------------
+ LATIN SMALL LETTER LJ LATIN CAPITAL LETTER LATIN CAPITAL LETTER
+ L WITH SMALL LETTER J LJ
+ LATIN SMALL LETTER NJ LATIN CAPITAL LETTER LATIN CAPITAL LETTER
+ N WITH SMALL LETTER J NJ
+ LATIN SMALL LETTER DZ LATIN CAPITAL LETTER LATIN CAPITAL LETTER
+ D WITH SMALL LETTER Z DZ
+ LATIN SMALL LETTER LATIN CAPITAL LETTER LATIN CAPITAL LETTER
+ DZ WITH CARON D WITH SMALL LETTER DZ WITH CARON
+ Z WITH CARON
+
+
+File: libunistring.info, Node: Case mappings of strings, Next: Case mappings of substrings, Prev: Case mappings of characters, Up: unicase.h
+
+13.2 Case mappings of strings
+=============================
+
+ Case mapping should always be performed on entire strings, not on
+individual characters. The functions in this sections do so.
+
+ These functions allow to apply a normalization after the case
+mapping. The reason is that if you want to treat `ä' and `Ä' the
+same, you most often also want to treat the composed and decomposed
+forms of such a character, U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+and U+0041 LATIN CAPITAL LETTER A U+0308 COMBINING DIAERESIS the same.
+The NF argument designates the normalization.
+
+ These functions are locale dependent. The ISO639_LANGUAGE argument
+identifies the language (e.g. `"tr"' for Turkish). NULL means to use
+locale independent case mappings.
+
+ -- Function: const char * uc_locale_language ()
+ Returns the ISO 639 language code of the current locale. Returns
+ `""' if it is unknown, or in the "C" locale.
+
+ -- Function: uint8_t * u8_toupper (const uint8_t *S, size_t N, const
+ char *ISO639_LANGUAGE, uninorm_t NF, uint8_t *RESULTBUF,
+ size_t *LENGTHP)
+ -- Function: uint16_t * u16_toupper (const uint16_t *S, size_t N,
+ const char *ISO639_LANGUAGE, uninorm_t NF, uint16_t
+ *RESULTBUF, size_t *LENGTHP)
+ -- Function: uint32_t * u32_toupper (const uint32_t *S, size_t N,
+ const char *ISO639_LANGUAGE, uninorm_t NF, uint32_t
+ *RESULTBUF, size_t *LENGTHP)
+ Returns the uppercase mapping of a string.
+
+ The NF argument identifies the normalization form to apply after
+ the case-mapping. It can also be NULL, for no normalization.
+
+ -- Function: uint8_t * u8_tolower (const uint8_t *S, size_t N, const
+ char *ISO639_LANGUAGE, uninorm_t NF, uint8_t *RESULTBUF,
+ size_t *LENGTHP)
+ -- Function: uint16_t * u16_tolower (const uint16_t *S, size_t N,
+ const char *ISO639_LANGUAGE, uninorm_t NF, uint16_t
+ *RESULTBUF, size_t *LENGTHP)
+ -- Function: uint32_t * u32_tolower (const uint32_t *S, size_t N,
+ const char *ISO639_LANGUAGE, uninorm_t NF, uint32_t
+ *RESULTBUF, size_t *LENGTHP)
+ Returns the lowercase mapping of a string.
+
+ The NF argument identifies the normalization form to apply after
+ the case-mapping. It can also be NULL, for no normalization.
+
+ -- Function: uint8_t * u8_totitle (const uint8_t *S, size_t N, const
+ char *ISO639_LANGUAGE, uninorm_t NF, uint8_t *RESULTBUF,
+ size_t *LENGTHP)
+ -- Function: uint16_t * u16_totitle (const uint16_t *S, size_t N,
+ const char *ISO639_LANGUAGE, uninorm_t NF, uint16_t
+ *RESULTBUF, size_t *LENGTHP)
+ -- Function: uint32_t * u32_totitle (const uint32_t *S, size_t N,
+ const char *ISO639_LANGUAGE, uninorm_t NF, uint32_t
+ *RESULTBUF, size_t *LENGTHP)
+ Returns the titlecase mapping of a string.
+
+ Mapping to title case means that, in each word, the first cased
+ character is being mapped to title case and the remaining
+ characters of the word are being mapped to lower case.
+
+ The NF argument identifies the normalization form to apply after
+ the case-mapping. It can also be NULL, for no normalization.
+
+
+File: libunistring.info, Node: Case mappings of substrings, Next: Case insensitive comparison, Prev: Case mappings of strings, Up: unicase.h
+
+13.3 Case mappings of substrings
+================================
+
+ Case mapping of a substring cannot simply be performed by extracting
+the substring and then applying the case mapping function to it. This
+does not work because case mapping requires some information about the
+surrounding characters. The following functions allow to apply case
+mappings to substrings of a given string, while taking into account the
+characters that precede it (the "prefix") and the characters that
+follow it (the "suffix").
+
+ -- Type: casing_prefix_context_t
+ This data type denotes the case-mapping context that is given by a
+ prefix string. It is an immediate type that can be copied by
+ simple assignment, without involving memory allocation. It is not
+ an array type.
+
+ -- Constant: casing_prefix_context_t unicase_empty_prefix_context
+ This constant is the case-mapping context that corresponds to an
+ empty prefix string.
+
+ The following functions return `casing_prefix_context_t' objects:
+
+ -- Function: casing_prefix_context_t u8_casing_prefix_context (const
+ uint8_t *S, size_t N)
+ -- Function: casing_prefix_context_t u16_casing_prefix_context (const
+ uint16_t *S, size_t N)
+ -- Function: casing_prefix_context_t u32_casing_prefix_context (const
+ uint32_t *S, size_t N)
+ Returns the case-mapping context of a given prefix string.
+
+ -- Function: casing_prefix_context_t u8_casing_prefixes_context (const
+ uint8_t *S, size_t N, casing_prefix_context_t A_CONTEXT)
+ -- Function: casing_prefix_context_t u16_casing_prefixes_context
+ (const uint16_t *S, size_t N, casing_prefix_context_t
+ A_CONTEXT)
+ -- Function: casing_prefix_context_t u32_casing_prefixes_context
+ (const uint32_t *S, size_t N, casing_prefix_context_t
+ A_CONTEXT)
+ Returns the case-mapping context of the prefix concat(A, S), given
+ the case-mapping context of the prefix A.
+
+ -- Type: casing_suffix_context_t
+ This data type denotes the case-mapping context that is given by a
+ suffix string. It is an immediate type that can be copied by
+ simple assignment, without involving memory allocation. It is not
+ an array type.
+
+ -- Constant: casing_suffix_context_t unicase_empty_suffix_context
+ This constant is the case-mapping context that corresponds to an
+ empty suffix string.
+
+ The following functions return `casing_suffix_context_t' objects:
+
+ -- Function: casing_suffix_context_t u8_casing_suffix_context (const
+ uint8_t *S, size_t N)
+ -- Function: casing_suffix_context_t u16_casing_suffix_context (const
+ uint16_t *S, size_t N)
+ -- Function: casing_suffix_context_t u32_casing_suffix_context (const
+ uint32_t *S, size_t N)
+ Returns the case-mapping context of a given suffix string.
+
+ -- Function: casing_suffix_context_t u8_casing_suffixes_context (const
+ uint8_t *S, size_t N, casing_suffix_context_t A_CONTEXT)
+ -- Function: casing_suffix_context_t u16_casing_suffixes_context
+ (const uint16_t *S, size_t N, casing_suffix_context_t
+ A_CONTEXT)
+ -- Function: casing_suffix_context_t u32_casing_suffixes_context
+ (const uint32_t *S, size_t N, casing_suffix_context_t
+ A_CONTEXT)
+ Returns the case-mapping context of the suffix concat(S, A), given
+ the case-mapping context of the suffix A.
+
+ The following functions perform a case mapping, considering the
+prefix context and the suffix context.
+
+ -- Function: uint8_t * u8_ct_toupper (const uint8_t *S, size_t N,
+ casing_prefix_context_t PREFIX_CONTEXT,
+ casing_suffix_context_t SUFFIX_CONTEXT, const char
+ *ISO639_LANGUAGE, uninorm_t NF, uint8_t *RESULTBUF, size_t
+ *LENGTHP)
+ -- Function: uint16_t * u16_ct_toupper (const uint16_t *S, size_t N,
+ casing_prefix_context_t PREFIX_CONTEXT,
+ casing_suffix_context_t SUFFIX_CONTEXT, const char
+ *ISO639_LANGUAGE, uninorm_t NF, uint16_t *RESULTBUF, size_t
+ *LENGTHP)
+ -- Function: uint32_t * u32_ct_toupper (const uint32_t *S, size_t N,
+ casing_prefix_context_t PREFIX_CONTEXT,
+ casing_suffix_context_t SUFFIX_CONTEXT, const char
+ *ISO639_LANGUAGE, uninorm_t NF, uint32_t *RESULTBUF, size_t
+ *LENGTHP)
+ Returns the uppercase mapping of a string that is surrounded by a
+ prefix and a suffix.
+
+ -- Function: uint8_t * u8_ct_tolower (const uint8_t *S, size_t N,
+ casing_prefix_context_t PREFIX_CONTEXT,
+ casing_suffix_context_t SUFFIX_CONTEXT, const char
+ *ISO639_LANGUAGE, uninorm_t NF, uint8_t *RESULTBUF, size_t
+ *LENGTHP)
+ -- Function: uint16_t * u16_ct_tolower (const uint16_t *S, size_t N,
+ casing_prefix_context_t PREFIX_CONTEXT,
+ casing_suffix_context_t SUFFIX_CONTEXT, const char
+ *ISO639_LANGUAGE, uninorm_t NF, uint16_t *RESULTBUF, size_t
+ *LENGTHP)
+ -- Function: uint32_t * u32_ct_tolower (const uint32_t *S, size_t N,
+ casing_prefix_context_t PREFIX_CONTEXT,
+ casing_suffix_context_t SUFFIX_CONTEXT, const char
+ *ISO639_LANGUAGE, uninorm_t NF, uint32_t *RESULTBUF, size_t
+ *LENGTHP)
+ Returns the lowercase mapping of a string that is surrounded by a
+ prefix and a suffix.
+
+ -- Function: uint8_t * u8_ct_totitle (const uint8_t *S, size_t N,
+ casing_prefix_context_t PREFIX_CONTEXT,
+ casing_suffix_context_t SUFFIX_CONTEXT, const char
+ *ISO639_LANGUAGE, uninorm_t NF, uint8_t *RESULTBUF, size_t
+ *LENGTHP)
+ -- Function: uint16_t * u16_ct_totitle (const uint16_t *S, size_t N,
+ casing_prefix_context_t PREFIX_CONTEXT,
+ casing_suffix_context_t SUFFIX_CONTEXT, const char
+ *ISO639_LANGUAGE, uninorm_t NF, uint16_t *RESULTBUF, size_t
+ *LENGTHP)
+ -- Function: uint32_t * u32_ct_totitle (const uint32_t *S, size_t N,
+ casing_prefix_context_t PREFIX_CONTEXT,
+ casing_suffix_context_t SUFFIX_CONTEXT, const char
+ *ISO639_LANGUAGE, uninorm_t NF, uint32_t *RESULTBUF, size_t
+ *LENGTHP)
+ Returns the titlecase mapping of a string that is surrounded by a
+ prefix and a suffix.
+
+ For example, to uppercase the UTF-8 substring between `s +
+start_index' and `s + end_index' of a string that extends from `s' to
+`s + u8_strlen (s)', you can use the statements
+
+ size_t result_length;
+ uint8_t result =
+ u8_ct_toupper (s + start_index, end_index - start_index,
+ u8_casing_prefix_context (s, start_index),
+ u8_casing_suffix_context (s + end_index,
+ u8_strlen (s) - end_index),
+ iso639_language, NULL, NULL, &result_length);
+
+
+File: libunistring.info, Node: Case insensitive comparison, Next: Case detection, Prev: Case mappings of substrings, Up: unicase.h
+
+13.4 Case insensitive comparison
+================================
+
+ The following functions implement comparison that ignores
+differences in case and normalization.
+
+ -- Function: uint8_t * u8_casefold (const uint8_t *S, size_t N, const
+ char *ISO639_LANGUAGE, uninorm_t NF, uint8_t *RESULTBUF,
+ size_t *LENGTHP)
+ -- Function: uint16_t * u16_casefold (const uint16_t *S, size_t N,
+ const char *ISO639_LANGUAGE, uninorm_t NF, uint16_t
+ *RESULTBUF, size_t *LENGTHP)
+ -- Function: uint32_t * u32_casefold (const uint32_t *S, size_t N,
+ const char *ISO639_LANGUAGE, uninorm_t NF, uint32_t
+ *RESULTBUF, size_t *LENGTHP)
+ Returns the case folded string.
+
+ Comparing `u8_casefold (S1)' and `u8_casefold (S2)' with the
+ `u8_cmp2' function is equivalent to comparing S1 and S2 with
+ `u8_casecmp'.
+
+ The NF argument identifies the normalization form to apply after
+ the case-mapping. It can also be NULL, for no normalization.
+
+ -- Function: uint8_t * u8_ct_casefold (const uint8_t *S, size_t N,
+ casing_prefix_context_t PREFIX_CONTEXT,
+ casing_suffix_context_t SUFFIX_CONTEXT, const char
+ *ISO639_LANGUAGE, uninorm_t NF, uint8_t *RESULTBUF, size_t
+ *LENGTHP)
+ -- Function: uint16_t * u16_ct_casefold (const uint16_t *S, size_t N,
+ casing_prefix_context_t PREFIX_CONTEXT,
+ casing_suffix_context_t SUFFIX_CONTEXT, const char
+ *ISO639_LANGUAGE, uninorm_t NF, uint16_t *RESULTBUF, size_t
+ *LENGTHP)
+ -- Function: uint32_t * u32_ct_casefold (const uint32_t *S, size_t N,
+ casing_prefix_context_t PREFIX_CONTEXT,
+ casing_suffix_context_t SUFFIX_CONTEXT, const char
+ *ISO639_LANGUAGE, uninorm_t NF, uint32_t *RESULTBUF, size_t
+ *LENGTHP)
+ Returns the case folded string. The case folding takes into
+ account the case mapping contexts of the prefix and suffix strings.
+
+ -- Function: int u8_casecmp (const uint8_t *S1, size_t N1, const
+ uint8_t *S2, size_t N2, const char *ISO639_LANGUAGE,
+ uninorm_t NF, int *RESULTP)
+ -- Function: int u16_casecmp (const uint16_t *S1, size_t N1, const
+ uint16_t *S2, size_t N2, const char *ISO639_LANGUAGE,
+ uninorm_t NF, int *RESULTP)
+ -- Function: int u32_casecmp (const uint32_t *S1, size_t N1, const
+ uint32_t *S2, size_t N2, const char *ISO639_LANGUAGE,
+ uninorm_t NF, int *RESULTP)
+ -- Function: int ulc_casecmp (const char *S1, size_t N1, const char
+ *S2, size_t N2, const char *ISO639_LANGUAGE, uninorm_t NF,
+ int *RESULTP)
+ Compares S1 and S2, ignoring differences in case and normalization.
+
+ The NF argument identifies the normalization form to apply after
+ the case-mapping. It can also be NULL, for no normalization.
+
+ If successful, sets `*RESULTP' to -1 if S1 < S2, 0 if S1 = S2, 1
+ if S1 > S2, and returns 0. Upon failure, returns -1 with `errno'
+ set.
+
+ The following functions additionally take into account the sorting
+rules of the current locale.
+
+ -- Function: char * u8_casexfrm (const uint8_t *S, size_t N, const
+ char *ISO639_LANGUAGE, uninorm_t NF, char *RESULTBUF, size_t
+ *LENGTHP)
+ -- Function: char * u16_casexfrm (const uint16_t *S, size_t N, const
+ char *ISO639_LANGUAGE, uninorm_t NF, char *RESULTBUF, size_t
+ *LENGTHP)
+ -- Function: char * u32_casexfrm (const uint32_t *S, size_t N, const
+ char *ISO639_LANGUAGE, uninorm_t NF, char *RESULTBUF, size_t
+ *LENGTHP)
+ -- Function: char * ulc_casexfrm (const char *S, size_t N, const char
+ *ISO639_LANGUAGE, uninorm_t NF, char *RESULTBUF, size_t
+ *LENGTHP)
+ Converts the string S of length N to a NUL-terminated byte
+ sequence, in such a way that comparing `u8_casexfrm (S1)' and
+ `u8_casexfrm (S2)' with the gnulib function `memcmp2' is
+ equivalent to comparing S1 and S2 with `u8_casecoll'.
+
+ NF must be either `UNINORM_NFC', `UNINORM_NFKC', or NULL for no
+ normalization.
+
+ -- Function: int u8_casecoll (const uint8_t *S1, size_t N1, const
+ uint8_t *S2, size_t N2, const char *ISO639_LANGUAGE,
+ uninorm_t NF, int *RESULTP)
+ -- Function: int u16_casecoll (const uint16_t *S1, size_t N1, const
+ uint16_t *S2, size_t N2, const char *ISO639_LANGUAGE,
+ uninorm_t NF, int *RESULTP)
+ -- Function: int u32_casecoll (const uint32_t *S1, size_t N1, const
+ uint32_t *S2, size_t N2, const char *ISO639_LANGUAGE,
+ uninorm_t NF, int *RESULTP)
+ -- Function: int ulc_casecoll (const char *S1, size_t N1, const char
+ *S2, size_t N2, const char *ISO639_LANGUAGE, uninorm_t NF,
+ int *RESULTP)
+ Compares S1 and S2, ignoring differences in case and normalization,
+ using the collation rules of the current locale.
+
+ The NF argument identifies the normalization form to apply after
+ the case-mapping. It must be either `UNINORM_NFC' or
+ `UNINORM_NFKC'. It can also be NULL, for no normalization.
+
+ If successful, sets `*RESULTP' to -1 if S1 < S2, 0 if S1 = S2, 1
+ if S1 > S2, and returns 0. Upon failure, returns -1 with `errno'
+ set.
+
+
+File: libunistring.info, Node: Case detection, Prev: Case insensitive comparison, Up: unicase.h
+
+13.5 Case detection
+===================
+
+ The following functions determine whether a Unicode string is
+entirely in upper case. or entirely in lower case, or entirely in title
+case, or already case-folded.
+
+ -- Function: int u8_is_uppercase (const uint8_t *S, size_t N, const
+ char *ISO639_LANGUAGE, bool *RESULTP)
+ -- Function: int u16_is_uppercase (const uint16_t *S, size_t N, const
+ char *ISO639_LANGUAGE, bool *RESULTP)
+ -- Function: int u32_is_uppercase (const uint32_t *S, size_t N, const
+ char *ISO639_LANGUAGE, bool *RESULTP)
+ Sets `*RESULTP' to true if mapping NFD(S) to upper case is a
+ no-op, or to false otherwise, and returns 0. Upon failure,
+ returns -1 with `errno' set.
+
+ -- Function: int u8_is_lowercase (const uint8_t *S, size_t N, const
+ char *ISO639_LANGUAGE, bool *RESULTP)
+ -- Function: int u16_is_lowercase (const uint16_t *S, size_t N, const
+ char *ISO639_LANGUAGE, bool *RESULTP)
+ -- Function: int u32_is_lowercase (const uint32_t *S, size_t N, const
+ char *ISO639_LANGUAGE, bool *RESULTP)
+ Sets `*RESULTP' to true if mapping NFD(S) to lower case is a
+ no-op, or to false otherwise, and returns 0. Upon failure,
+ returns -1 with `errno' set.
+
+ -- Function: int u8_is_titlecase (const uint8_t *S, size_t N, const
+ char *ISO639_LANGUAGE, bool *RESULTP)
+ -- Function: int u16_is_titlecase (const uint16_t *S, size_t N, const
+ char *ISO639_LANGUAGE, bool *RESULTP)
+ -- Function: int u32_is_titlecase (const uint32_t *S, size_t N, const
+ char *ISO639_LANGUAGE, bool *RESULTP)
+ Sets `*RESULTP' to true if mapping NFD(S) to title case is a
+ no-op, or to false otherwise, and returns 0. Upon failure,
+ returns -1 with `errno' set.
+
+ -- Function: int u8_is_casefolded (const uint8_t *S, size_t N, const
+ char *ISO639_LANGUAGE, bool *RESULTP)
+ -- Function: int u16_is_casefolded (const uint16_t *S, size_t N, const
+ char *ISO639_LANGUAGE, bool *RESULTP)
+ -- Function: int u32_is_casefolded (const uint32_t *S, size_t N, const
+ char *ISO639_LANGUAGE, bool *RESULTP)
+ Sets `*RESULTP' to true if applying case folding to NFD(S) is a
+ no-op, or to false otherwise, and returns 0. Upon failure,
+ returns -1 with `errno' set.
+
+ The following functions determine whether case mappings have any
+effect on a Unicode string.
+
+ -- Function: int u8_is_cased (const uint8_t *S, size_t N, const char
+ *ISO639_LANGUAGE, bool *RESULTP)
+ -- Function: int u16_is_cased (const uint16_t *S, size_t N, const char
+ *ISO639_LANGUAGE, bool *RESULTP)
+ -- Function: int u32_is_cased (const uint32_t *S, size_t N, const char
+ *ISO639_LANGUAGE, bool *RESULTP)
+ Sets `*RESULTP' to true if case matters for S, that is, if mapping
+ NFD(S) to either upper case or lower case or title case is not a
+ no-op. Set `*RESULTP' to false if NFD(S) maps to itself under the
+ upper case mapping, under the lower case mapping, and under the
+ title case mapping; in other words, when NFD(S) consists entirely
+ of caseless characters. Upon failure, returns -1 with `errno' set.
+
+
+File: libunistring.info, Node: uniregex.h, Next: Using the library, Prev: unicase.h, Up: Top
+
+14 Regular expressions `<uniregex.h>'
+*************************************
+
+ This include file is not yet implemented.
+
+
+File: libunistring.info, Node: Using the library, Next: More functionality, Prev: uniregex.h, Up: Top
+
+15 Using the library
+********************
+
+ This chapter explains some practical considerations, regarding the
+installation and compiler options that are needed in order to use this
+library.
+
+* Menu:
+
+* Installation::
+* Compiler options::
+* Include files::
+* Autoconf macro::
+* Reporting problems::
+
+
+File: libunistring.info, Node: Installation, Next: Compiler options, Up: Using the library
+
+15.1 Installation
+=================
+
+ Before you can use the library, it must be installed. First, you
+have to make sure all dependencies are installed. They are listed in
+the file `DEPENDENCIES'.
+
+ Then you can proceed to build and install the library, as described
+in the file `INSTALL'. For installation on Windows systems, please
+refer to the file `README.woe32'.
+
+
+File: libunistring.info, Node: Compiler options, Next: Include files, Prev: Installation, Up: Using the library
+
+15.2 Compiler options
+=====================
+
+ Let's denote as `LIBUNISTRING_PREFIX' the value of the `--prefix'
+option that you passed to `configure' while installing this package.
+If you didn't pass any `--prefix' option, then the package is installed
+in `/usr/local'.
+
+ Let's denote as `LIBUNISTRING_INCLUDEDIR' the directory where the
+include files were installed. This is usually the same as
+`${LIBUNISTRING_PREFIX}/include'. Except that if you passed an
+`--includedir' option to `configure', it is the value of that option.
+
+ Let's further denote as `LIBUNISTRING_LIBDIR' the directory where
+the library itself was installed. This is the value that you passed
+with the `--libdir' option to `configure', or otherwise the same as
+`${LIBUNISTRING_PREFIX}/lib'. Recall that when building in 64-bit mode
+on a 64-bit GNU/Linux system that supports executables in either 64-bit
+mode or 32-bit mode, you should have used the option
+`--libdir=${LIBUNISTRING_PREFIX}/lib64'.
+
+ So that the compiler finds the include files, you have to pass it the
+option `-I${LIBUNISTRING_INCLUDEDIR}'.
+
+ So that the compiler finds the library during its linking pass, you
+have to pass it the options `-L${LIBUNISTRING_LIBDIR} -lunistring'. On
+some systems, in some configurations, you also have to pass options
+needed for linking with `libiconv'. The autoconf macro
+`gl_LIBUNISTRING' (see *note Autoconf macro::) deals with this
+particularity.
+
+
+File: libunistring.info, Node: Include files, Next: Autoconf macro, Prev: Compiler options, Up: Using the library
+
+15.3 Include files
+==================
+
+ Most of the include files have been presented in the introduction,
+see *note Introduction::, and subsequent detailed chapters.
+
+ Another include file is `<unistring/version.h>'. It contains the
+version number of the libunistring library.
+
+ -- Macro: int _LIBUNISTRING_VERSION
+ This constant contains the version of libunistring that is being
+ used at compile time. It encodes the major and minor parts of the
+ version number only. These parts are encoded in the form
+ `(major<<8) + minor'.
+
+ -- Constant: int _libunistring_version
+ This constant contains the version of libunistring that is being
+ used at run time. It encodes the major and minor parts of the
+ version number only. These parts are encoded in the form
+ `(major<<8) + minor'.
+
+ It is possible that `_libunistring_version' is greater than
+`_LIBUNISTRING_VERSION'. This can happen when you use `libunistring'
+as a shared library, and a newer, binary backward-compatible version
+has been installed after your program that uses `libunistring' was
+installed.
+
+
+File: libunistring.info, Node: Autoconf macro, Next: Reporting problems, Prev: Include files, Up: Using the library
+
+15.4 Autoconf macro
+===================
+
+ GNU Gnulib provides an autoconf macro that tests for the availability
+of `libunistring'. It is contained in the Gnulib module
+`libunistring', see
+`http://www.gnu.org/software/gnulib/MODULES.html#module=libunistring'.
+
+ The macro is called `gl_LIBUNISTRING'. It searches for an installed
+libunistring. If found, it sets and AC_SUBSTs `HAVE_LIBUNISTRING=yes'
+and the `LIBUNISTRING' and `LTLIBUNISTRING' variables and augments the
+`CPPFLAGS' variable, and defines the C macro `HAVE_LIBUNISTRING' to 1.
+Otherwise, it sets and AC_SUBSTs `HAVE_LIBUNISTRING=no' and
+`LIBUNISTRING' and `LTLIBUNISTRING' to empty.
+
+ The complexities that `gl_LIBUNISTRING' deals with are the following:
+
+ * On some operating systems, in some configurations, libunistring
+ depends on `libiconv', and the options for linking with libiconv
+ must be mentioned explicitly on the link command line.
+
+ * GNU `libunistring', if installed, is not necessarily already in the
+ search path (`CPPFLAGS' for the include file search path,
+ `LDFLAGS' for the library search path).
+
+ * GNU `libunistring', if installed, is not necessarily already in the
+ run time library search path. To avoid the need for setting an
+ environment variable like `LD_LIBRARY_PATH', the macro adds the
+ appropriate run time search path options to the `LIBUNISTRING'
+ variable. This works on most systems.
+
+
+File: libunistring.info, Node: Reporting problems, Prev: Autoconf macro, Up: Using the library
+
+15.5 Reporting problems
+=======================
+
+ If you encounter any problem, please don't hesitate to send a
+detailed bug report to the `bug-libunistring@gnu.org' mailing list.
+You can alternatively also use the bug tracker at the project page
+`https://savannah.gnu.org/projects/libunistring'.
+
+ Please always include the version number of this library, and a short
+description of your operating system and compilation environment with
+corresponding version numbers.
+
+ For problems that appear while building and installing
+`libunistring', for which you don't find the remedy in the `INSTALL'
+file, please include a description of the options that you passed to
+the `configure' script.
+
+
+File: libunistring.info, Node: More functionality, Next: Licenses, Prev: Using the library, Up: Top
+
+16 More advanced functionality
+******************************
+
+ For bidirectional reordering of strings, we recommend the GNU
+FriBidi library: `http://www.fribidi.org/'.
+
+ For the rendering of Unicode strings outside of the context of a
+given toolkit (KDE/Qt or GNOME/Gtk), we recommend the Pango library:
+`http://www.pango.org/'.
+
+
+File: libunistring.info, Node: Licenses, Next: Index, Prev: More functionality, Up: Top
+
+Appendix A Licenses
+*******************
+
+ The files of this package are covered by the licenses indicated in
+each particular file or directory. Here is a summary:
+
+ * The `libunistring' library is covered by the GNU Lesser General
+ Public License (LGPL). A copy of the license is included in *note
+ GNU LGPL::.
+
+ * This manual is free documentation. It is dually licensed under the
+ GNU FDL and the GNU GPL. This means that you can redistribute this
+ manual under either of these two licenses, at your choice.
+ This manual is covered by the GNU FDL. Permission is granted to
+ copy, distribute and/or modify this document under the terms of the
+ GNU Free Documentation License (FDL), either version 1.2 of the
+ License, or (at your option) any later version published by the
+ Free Software Foundation (FSF); with no Invariant Sections, with no
+ Front-Cover Text, and with no Back-Cover Texts. A copy of the
+ license is included in *note GNU FDL::.
+ This manual is covered by the GNU GPL. You can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ (GPL), either version 3 of the License, or (at your option) any
+ later version published by the Free Software Foundation (FSF). A
+ copy of the license is included in *note GNU GPL::.
+
+* Menu:
+
+* GNU GPL:: GNU General Public License
+* GNU LGPL:: GNU Lesser General Public License
+* GNU FDL:: GNU Free Documentation License
+
+
+File: libunistring.info, Node: GNU GPL, Next: GNU LGPL, Up: Licenses
+
+A.1 GNU GENERAL PUBLIC LICENSE
+==============================
+
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. `http://fsf.org/'
+
+ Everyone is permitted to copy and distribute verbatim copies of this
+ license document, but changing it is not allowed.
+
+Preamble
+========
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains
+free software for all its users. We, the Free Software Foundation, use
+the GNU General Public License for most of our software; it applies
+also to any other work released this way by its authors. You can apply
+it to your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you
+have certain responsibilities if you distribute copies of the software,
+or if you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the
+manufacturer can do so. This is fundamentally incompatible with the
+aim of protecting users' freedom to change the software. The
+systematic pattern of such abuse occurs in the area of products for
+individuals to use, which is precisely where it is most unacceptable.
+Therefore, we have designed this version of the GPL to prohibit the
+practice for those products. If such problems arise substantially in
+other domains, we stand ready to extend this provision to those domains
+in future versions of the GPL, as needed to protect the freedom of
+users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+TERMS AND CONDITIONS
+====================
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public
+ License.
+
+ "Copyright" also means copyright-like laws that apply to other
+ kinds of works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+ License. Each licensee is addressed as "you". "Licensees" and
+ "recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the
+ work in a fashion requiring copyright permission, other than the
+ making of an exact copy. The resulting work is called a "modified
+ version" of the earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work
+ based on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+ permission, would make you directly or secondarily liable for
+ infringement under applicable copyright law, except executing it
+ on a computer or modifying a private copy. Propagation includes
+ copying, distribution (with or without modification), making
+ available to the public, and in some countries other activities as
+ well.
+
+ To "convey" a work means any kind of propagation that enables other
+ parties to make or receive copies. Mere interaction with a user
+ through a computer network, with no transfer of a copy, is not
+ conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+ to the extent that it includes a convenient and prominently visible
+ feature that (1) displays an appropriate copyright notice, and (2)
+ tells the user that there is no warranty for the work (except to
+ the extent that warranties are provided), that licensees may
+ convey the work under this License, and how to view a copy of this
+ License. If the interface presents a list of user commands or
+ options, such as a menu, a prominent item in the list meets this
+ criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+ for making modifications to it. "Object code" means any
+ non-source form of a work.
+
+ A "Standard Interface" means an interface that either is an
+ official standard defined by a recognized standards body, or, in
+ the case of interfaces specified for a particular programming
+ language, one that is widely used among developers working in that
+ language.
+
+ The "System Libraries" of an executable work include anything,
+ other than the work as a whole, that (a) is included in the normal
+ form of packaging a Major Component, but which is not part of that
+ Major Component, and (b) serves only to enable use of the work
+ with that Major Component, or to implement a Standard Interface
+ for which an implementation is available to the public in source
+ code form. A "Major Component", in this context, means a major
+ essential component (kernel, window system, and so on) of the
+ specific operating system (if any) on which the executable work
+ runs, or a compiler used to produce the work, or an object code
+ interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+ the source code needed to generate, install, and (for an executable
+ work) run the object code and to modify the work, including
+ scripts to control those activities. However, it does not include
+ the work's System Libraries, or general-purpose tools or generally
+ available free programs which are used unmodified in performing
+ those activities but which are not part of the work. For example,
+ Corresponding Source includes interface definition files
+ associated with source files for the work, and the source code for
+ shared libraries and dynamically linked subprograms that the work
+ is specifically designed to require, such as by intimate data
+ communication or control flow between those subprograms and other
+ parts of the work.
+
+ The Corresponding Source need not include anything that users can
+ regenerate automatically from other parts of the Corresponding
+ Source.
+
+ The Corresponding Source for a work in source code form is that
+ same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+ copyright on the Program, and are irrevocable provided the stated
+ conditions are met. This License explicitly affirms your unlimited
+ permission to run the unmodified Program. The output from running
+ a covered work is covered by this License only if the output,
+ given its content, constitutes a covered work. This License
+ acknowledges your rights of fair use or other equivalent, as
+ provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+ convey, without conditions so long as your license otherwise
+ remains in force. You may convey covered works to others for the
+ sole purpose of having them make modifications exclusively for
+ you, or provide you with facilities for running those works,
+ provided that you comply with the terms of this License in
+ conveying all material for which you do not control copyright.
+ Those thus making or running the covered works for you must do so
+ exclusively on your behalf, under your direction and control, on
+ terms that prohibit them from making any copies of your
+ copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+ the conditions stated below. Sublicensing is not allowed; section
+ 10 makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+ measure under any applicable law fulfilling obligations under
+ article 11 of the WIPO copyright treaty adopted on 20 December
+ 1996, or similar laws prohibiting or restricting circumvention of
+ such measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+ circumvention of technological measures to the extent such
+ circumvention is effected by exercising rights under this License
+ with respect to the covered work, and you disclaim any intention
+ to limit operation or modification of the work as a means of
+ enforcing, against the work's users, your or third parties' legal
+ rights to forbid circumvention of technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+ receive it, in any medium, provided that you conspicuously and
+ appropriately publish on each copy an appropriate copyright notice;
+ keep intact all notices stating that this License and any
+ non-permissive terms added in accord with section 7 apply to the
+ code; keep intact all notices of the absence of any warranty; and
+ give all recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+ and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+ produce it from the Program, in the form of source code under the
+ terms of section 4, provided that you also meet all of these
+ conditions:
+
+ a. The work must carry prominent notices stating that you
+ modified it, and giving a relevant date.
+
+ b. The work must carry prominent notices stating that it is
+ released under this License and any conditions added under
+ section 7. This requirement modifies the requirement in
+ section 4 to "keep intact all notices".
+
+ c. You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable
+ section 7 additional terms, to the whole of the work, and all
+ its parts, regardless of how they are packaged. This License
+ gives no permission to license the work in any other way, but
+ it does not invalidate such permission if you have separately
+ received it.
+
+ d. If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has
+ interactive interfaces that do not display Appropriate Legal
+ Notices, your work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+ works, which are not by their nature extensions of the covered
+ work, and which are not combined with it such as to form a larger
+ program, in or on a volume of a storage or distribution medium, is
+ called an "aggregate" if the compilation and its resulting
+ copyright are not used to limit the access or legal rights of the
+ compilation's users beyond what the individual works permit.
+ Inclusion of a covered work in an aggregate does not cause this
+ License to apply to the other parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+ of sections 4 and 5, provided that you also convey the
+ machine-readable Corresponding Source under the terms of this
+ License, in one of these ways:
+
+ a. Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b. Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for
+ as long as you offer spare parts or customer support for that
+ product model, to give anyone who possesses the object code
+ either (1) a copy of the Corresponding Source for all the
+ software in the product that is covered by this License, on a
+ durable physical medium customarily used for software
+ interchange, for a price no more than your reasonable cost of
+ physically performing this conveying of source, or (2) access
+ to copy the Corresponding Source from a network server at no
+ charge.
+
+ c. Convey individual copies of the object code with a copy of
+ the written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially,
+ and only if you received the object code with such an offer,
+ in accord with subsection 6b.
+
+ d. Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access
+ to the Corresponding Source in the same way through the same
+ place at no further charge. You need not require recipients
+ to copy the Corresponding Source along with the object code.
+ If the place to copy the object code is a network server, the
+ Corresponding Source may be on a different server (operated
+ by you or a third party) that supports equivalent copying
+ facilities, provided you maintain clear directions next to
+ the object code saying where to find the Corresponding Source.
+ Regardless of what server hosts the Corresponding Source, you
+ remain obligated to ensure that it is available for as long
+ as needed to satisfy these requirements.
+
+ e. Convey the object code using peer-to-peer transmission,
+ provided you inform other peers where the object code and
+ Corresponding Source of the work are being offered to the
+ general public at no charge under subsection 6d.
+
+
+ A separable portion of the object code, whose source code is
+ excluded from the Corresponding Source as a System Library, need
+ not be included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means
+ any tangible personal property which is normally used for personal,
+ family, or household purposes, or (2) anything designed or sold for
+ incorporation into a dwelling. In determining whether a product
+ is a consumer product, doubtful cases shall be resolved in favor of
+ coverage. For a particular product received by a particular user,
+ "normally used" refers to a typical or common use of that class of
+ product, regardless of the status of the particular user or of the
+ way in which the particular user actually uses, or expects or is
+ expected to use, the product. A product is a consumer product
+ regardless of whether the product has substantial commercial,
+ industrial or non-consumer uses, unless such uses represent the
+ only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+ procedures, authorization keys, or other information required to
+ install and execute modified versions of a covered work in that
+ User Product from a modified version of its Corresponding Source.
+ The information must suffice to ensure that the continued
+ functioning of the modified object code is in no case prevented or
+ interfered with solely because modification has been made.
+
+ If you convey an object code work under this section in, or with,
+ or specifically for use in, a User Product, and the conveying
+ occurs as part of a transaction in which the right of possession
+ and use of the User Product is transferred to the recipient in
+ perpetuity or for a fixed term (regardless of how the transaction
+ is characterized), the Corresponding Source conveyed under this
+ section must be accompanied by the Installation Information. But
+ this requirement does not apply if neither you nor any third party
+ retains the ability to install modified object code on the User
+ Product (for example, the work has been installed in ROM).
+
+ The requirement to provide Installation Information does not
+ include a requirement to continue to provide support service,
+ warranty, or updates for a work that has been modified or
+ installed by the recipient, or for the User Product in which it
+ has been modified or installed. Access to a network may be denied
+ when the modification itself materially and adversely affects the
+ operation of the network or violates the rules and protocols for
+ communication across the network.
+
+ Corresponding Source conveyed, and Installation Information
+ provided, in accord with this section must be in a format that is
+ publicly documented (and with an implementation available to the
+ public in source code form), and must require no special password
+ or key for unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of
+ this License by making exceptions from one or more of its
+ conditions. Additional permissions that are applicable to the
+ entire Program shall be treated as though they were included in
+ this License, to the extent that they are valid under applicable
+ law. If additional permissions apply only to part of the Program,
+ that part may be used separately under those permissions, but the
+ entire Program remains governed by this License without regard to
+ the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+ remove any additional permissions from that copy, or from any part
+ of it. (Additional permissions may be written to require their own
+ removal in certain cases when you modify the work.) You may place
+ additional permissions on material, added by you to a covered work,
+ for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material
+ you add to a covered work, you may (if authorized by the copyright
+ holders of that material) supplement the terms of this License
+ with terms:
+
+ a. Disclaiming warranty or limiting liability differently from
+ the terms of sections 15 and 16 of this License; or
+
+ b. Requiring preservation of specified reasonable legal notices
+ or author attributions in that material or in the Appropriate
+ Legal Notices displayed by works containing it; or
+
+ c. Prohibiting misrepresentation of the origin of that material,
+ or requiring that modified versions of such material be
+ marked in reasonable ways as different from the original
+ version; or
+
+ d. Limiting the use for publicity purposes of names of licensors
+ or authors of the material; or
+
+ e. Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f. Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified
+ versions of it) with contractual assumptions of liability to
+ the recipient, for any liability that these contractual
+ assumptions directly impose on those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+ restrictions" within the meaning of section 10. If the Program as
+ you received it, or any part of it, contains a notice stating that
+ it is governed by this License along with a term that is a further
+ restriction, you may remove that term. If a license document
+ contains a further restriction but permits relicensing or
+ conveying under this License, you may add to a covered work
+ material governed by the terms of that license document, provided
+ that the further restriction does not survive such relicensing or
+ conveying.
+
+ If you add terms to a covered work in accord with this section, you
+ must place, in the relevant source files, a statement of the
+ additional terms that apply to those files, or a notice indicating
+ where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in
+ the form of a separately written license, or stated as exceptions;
+ the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+ provided under this License. Any attempt otherwise to propagate or
+ modify it is void, and will automatically terminate your rights
+ under this License (including any patent licenses granted under
+ the third paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+ license from a particular copyright holder is reinstated (a)
+ provisionally, unless and until the copyright holder explicitly
+ and finally terminates your license, and (b) permanently, if the
+ copyright holder fails to notify you of the violation by some
+ reasonable means prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+ reinstated permanently if the copyright holder notifies you of the
+ violation by some reasonable means, this is the first time you have
+ received notice of violation of this License (for any work) from
+ that copyright holder, and you cure the violation prior to 30 days
+ after your receipt of the notice.
+
+ Termination of your rights under this section does not terminate
+ the licenses of parties who have received copies or rights from
+ you under this License. If your rights have been terminated and
+ not permanently reinstated, you do not qualify to receive new
+ licenses for the same material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+ run a copy of the Program. Ancillary propagation of a covered work
+ occurring solely as a consequence of using peer-to-peer
+ transmission to receive a copy likewise does not require
+ acceptance. However, nothing other than this License grants you
+ permission to propagate or modify any covered work. These actions
+ infringe copyright if you do not accept this License. Therefore,
+ by modifying or propagating a covered work, you indicate your
+ acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+ receives a license from the original licensors, to run, modify and
+ propagate that work, subject to this License. You are not
+ responsible for enforcing compliance by third parties with this
+ License.
+
+ An "entity transaction" is a transaction transferring control of an
+ organization, or substantially all assets of one, or subdividing an
+ organization, or merging organizations. If propagation of a
+ covered work results from an entity transaction, each party to that
+ transaction who receives a copy of the work also receives whatever
+ licenses to the work the party's predecessor in interest had or
+ could give under the previous paragraph, plus a right to
+ possession of the Corresponding Source of the work from the
+ predecessor in interest, if the predecessor has it or can get it
+ with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+ rights granted or affirmed under this License. For example, you
+ may not impose a license fee, royalty, or other charge for
+ exercise of rights granted under this License, and you may not
+ initiate litigation (including a cross-claim or counterclaim in a
+ lawsuit) alleging that any patent claim is infringed by making,
+ using, selling, offering for sale, or importing the Program or any
+ portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+ License of the Program or a work on which the Program is based.
+ The work thus licensed is called the contributor's "contributor
+ version".
+
+ A contributor's "essential patent claims" are all patent claims
+ owned or controlled by the contributor, whether already acquired or
+ hereafter acquired, that would be infringed by some manner,
+ permitted by this License, of making, using, or selling its
+ contributor version, but do not include claims that would be
+ infringed only as a consequence of further modification of the
+ contributor version. For purposes of this definition, "control"
+ includes the right to grant patent sublicenses in a manner
+ consistent with the requirements of this License.
+
+ Each contributor grants you a non-exclusive, worldwide,
+ royalty-free patent license under the contributor's essential
+ patent claims, to make, use, sell, offer for sale, import and
+ otherwise run, modify and propagate the contents of its
+ contributor version.
+
+ In the following three paragraphs, a "patent license" is any
+ express agreement or commitment, however denominated, not to
+ enforce a patent (such as an express permission to practice a
+ patent or covenant not to sue for patent infringement). To
+ "grant" such a patent license to a party means to make such an
+ agreement or commitment not to enforce a patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent
+ license, and the Corresponding Source of the work is not available
+ for anyone to copy, free of charge and under the terms of this
+ License, through a publicly available network server or other
+ readily accessible means, then you must either (1) cause the
+ Corresponding Source to be so available, or (2) arrange to deprive
+ yourself of the benefit of the patent license for this particular
+ work, or (3) arrange, in a manner consistent with the requirements
+ of this License, to extend the patent license to downstream
+ recipients. "Knowingly relying" means you have actual knowledge
+ that, but for the patent license, your conveying the covered work
+ in a country, or your recipient's use of the covered work in a
+ country, would infringe one or more identifiable patents in that
+ country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+ arrangement, you convey, or propagate by procuring conveyance of, a
+ covered work, and grant a patent license to some of the parties
+ receiving the covered work authorizing them to use, propagate,
+ modify or convey a specific copy of the covered work, then the
+ patent license you grant is automatically extended to all
+ recipients of the covered work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+ the scope of its coverage, prohibits the exercise of, or is
+ conditioned on the non-exercise of one or more of the rights that
+ are specifically granted under this License. You may not convey a
+ covered work if you are a party to an arrangement with a third
+ party that is in the business of distributing software, under
+ which you make payment to the third party based on the extent of
+ your activity of conveying the work, and under which the third
+ party grants, to any of the parties who would receive the covered
+ work from you, a discriminatory patent license (a) in connection
+ with copies of the covered work conveyed by you (or copies made
+ from those copies), or (b) primarily for and in connection with
+ specific products or compilations that contain the covered work,
+ unless you entered into that arrangement, or that patent license
+ was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+ any implied license or other defenses to infringement that may
+ otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order,
+ agreement or otherwise) that contradict the conditions of this
+ License, they do not excuse you from the conditions of this
+ License. If you cannot convey a covered work so as to satisfy
+ simultaneously your obligations under this License and any other
+ pertinent obligations, then as a consequence you may not convey it
+ at all. For example, if you agree to terms that obligate you to
+ collect a royalty for further conveying from those to whom you
+ convey the Program, the only way you could satisfy both those
+ terms and this License would be to refrain entirely from conveying
+ the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+ permission to link or combine any covered work with a work licensed
+ under version 3 of the GNU Affero General Public License into a
+ single combined work, and to convey the resulting work. The terms
+ of this License will continue to apply to the part which is the
+ covered work, but the special requirements of the GNU Affero
+ General Public License, section 13, concerning interaction through
+ a network will apply to the combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new
+ versions of the GNU General Public License from time to time.
+ Such new versions will be similar in spirit to the present
+ version, but may differ in detail to address new problems or
+ concerns.
+
+ Each version is given a distinguishing version number. If the
+ Program specifies that a certain numbered version of the GNU
+ General Public License "or any later version" applies to it, you
+ have the option of following the terms and conditions either of
+ that numbered version or of any later version published by the
+ Free Software Foundation. If the Program does not specify a
+ version number of the GNU General Public License, you may choose
+ any version ever published by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+ versions of the GNU General Public License can be used, that
+ proxy's public statement of acceptance of a version permanently
+ authorizes you to choose that version for the Program.
+
+ Later license versions may give you additional or different
+ permissions. However, no additional obligations are imposed on any
+ author or copyright holder as a result of your choosing to follow a
+ later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+ APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE
+ COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS"
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE
+ RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
+ SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
+ NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES
+ AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
+ FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+ CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
+ THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
+ BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+ PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF
+ THE POSSIBILITY OF SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+ above cannot be given local legal effect according to their terms,
+ reviewing courts shall apply local law that most closely
+ approximates an absolute waiver of all civil liability in
+ connection with the Program, unless a warranty or assumption of
+ liability accompanies a copy of the Program in return for a fee.
+
+
+END OF TERMS AND CONDITIONS
+===========================
+
+How to Apply These Terms to Your New Programs
+=============================================
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES.
+ Copyright (C) YEAR NAME OF AUTHOR
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see `http://www.gnu.org/licenses/'.
+
+ Also add information on how to contact you by electronic and paper
+mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ PROGRAM Copyright (C) YEAR NAME OF AUTHOR
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+ The hypothetical commands `show w' and `show c' should show the
+appropriate parts of the General Public License. Of course, your
+program's commands might be different; for a GUI interface, you would
+use an "about box".
+
+ You should also get your employer (if you work as a programmer) or
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. For more information on this, and how to apply and follow
+the GNU GPL, see `http://www.gnu.org/licenses/'.
+
+ The GNU General Public License does not permit incorporating your
+program into proprietary programs. If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library. If this is what you want to do, use the
+GNU Lesser General Public License instead of this License. But first,
+please read `http://www.gnu.org/philosophy/why-not-lgpl.html'.
+
+
+File: libunistring.info, Node: GNU LGPL, Next: GNU FDL, Prev: GNU GPL, Up: Licenses
+
+A.2 GNU LESSER GENERAL PUBLIC LICENSE
+=====================================
+
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. `http://fsf.org/'
+
+ Everyone is permitted to copy and distribute verbatim copies of this
+ license document, but changing it is not allowed.
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU
+ Lesser General Public License, and the "GNU GPL" refers to version
+ 3 of the GNU General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+ other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface
+ provided by the Library, but which is not otherwise based on the
+ Library. Defining a subclass of a class defined by the Library is
+ deemed a mode of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+ Application with the Library. The particular version of the
+ Library with which the Combined Work was made is also called the
+ "Linked Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+ Corresponding Source for the Combined Work, excluding any source
+ code for portions of the Combined Work that, considered in
+ isolation, are based on the Application, and not on the Linked
+ Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+ object code and/or source code for the Application, including any
+ data and utility programs needed for reproducing the Combined Work
+ from the Application, but excluding the System Libraries of the
+ Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this
+ License without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+ facility refers to a function or data to be supplied by an
+ Application that uses the facility (other than as an argument
+ passed when the facility is invoked), then you may convey a copy
+ of the modified version:
+
+ a. under this License, provided that you make a good faith
+ effort to ensure that, in the event an Application does not
+ supply the function or data, the facility still operates, and
+ performs whatever part of its purpose remains meaningful, or
+
+ b. under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material
+ from a header file that is part of the Library. You may convey
+ such object code under terms of your choice, provided that, if the
+ incorporated material is not limited to numerical parameters, data
+ structure layouts and accessors, or small macros, inline functions
+ and templates (ten or fewer lines in length), you do both of the
+ following:
+
+ a. Give prominent notice with each copy of the object code that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b. Accompany the object code with a copy of the GNU GPL and this
+ license document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+ taken together, effectively do not restrict modification of the
+ portions of the Library contained in the Combined Work and reverse
+ engineering for debugging such modifications, if you also do each
+ of the following:
+
+ a. Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b. Accompany the Combined Work with a copy of the GNU GPL and
+ this license document.
+
+ c. For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to
+ the copies of the GNU GPL and this license document.
+
+ d. Do one of the following:
+
+ 0. Convey the Minimal Corresponding Source under the terms
+ of this License, and the Corresponding Application Code
+ in a form suitable for, and under terms that permit, the
+ user to recombine or relink the Application with a
+ modified version of the Linked Version to produce a
+ modified Combined Work, in the manner specified by
+ section 6 of the GNU GPL for conveying Corresponding
+ Source.
+
+ 1. Use a suitable shared library mechanism for linking with
+ the Library. A suitable mechanism is one that (a) uses
+ at run time a copy of the Library already present on the
+ user's computer system, and (b) will operate properly
+ with a modified version of the Library that is
+ interface-compatible with the Linked Version.
+
+ e. Provide Installation Information, but only if you would
+ otherwise be required to provide such information under
+ section 6 of the GNU GPL, and only to the extent that such
+ information is necessary to install and execute a modified
+ version of the Combined Work produced by recombining or
+ relinking the Application with a modified version of the
+ Linked Version. (If you use option 4d0, the Installation
+ Information must accompany the Minimal Corresponding Source
+ and Corresponding Application Code. If you use option 4d1,
+ you must provide the Installation Information in the manner
+ specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+ Library side by side in a single library together with other
+ library facilities that are not Applications and are not covered
+ by this License, and convey such a combined library under terms of
+ your choice, if you do both of the following:
+
+ a. Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities, conveyed under the terms of this License.
+
+ b. Give prominent notice with the combined library that part of
+ it is a work based on the Library, and explaining where to
+ find the accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new
+ versions of the GNU Lesser General Public License from time to
+ time. Such new versions will be similar in spirit to the present
+ version, but may differ in detail to address new problems or
+ concerns.
+
+ Each version is given a distinguishing version number. If the
+ Library as you received it specifies that a certain numbered
+ version of the GNU Lesser General Public License "or any later
+ version" applies to it, you have the option of following the terms
+ and conditions either of that published version or of any later
+ version published by the Free Software Foundation. If the Library
+ as you received it does not specify a version number of the GNU
+ Lesser General Public License, you may choose any version of the
+ GNU Lesser General Public License ever published by the Free
+ Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+ whether future versions of the GNU Lesser General Public License
+ shall apply, that proxy's public statement of acceptance of any
+ version is permanent authorization for you to choose that version
+ for the Library.
+
+
+
+File: libunistring.info, Node: GNU FDL, Prev: GNU LGPL, Up: Licenses
+
+A.3 GNU Free Documentation License
+==================================
+
+ Version 1.3, 3 November 2008
+
+ Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+ `http://fsf.org/'
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ 0. PREAMBLE
+
+ The purpose of this License is to make a manual, textbook, or other
+ functional and useful document "free" in the sense of freedom: to
+ assure everyone the effective freedom to copy and redistribute it,
+ with or without modifying it, either commercially or
+ noncommercially. Secondarily, this License preserves for the
+ author and publisher a way to get credit for their work, while not
+ being considered responsible for modifications made by others.
+
+ This License is a kind of "copyleft", which means that derivative
+ works of the document must themselves be free in the same sense.
+ It complements the GNU General Public License, which is a copyleft
+ license designed for free software.
+
+ We have designed this License in order to use it for manuals for
+ free software, because free software needs free documentation: a
+ free program should come with manuals providing the same freedoms
+ that the software does. But this License is not limited to
+ software manuals; it can be used for any textual work, regardless
+ of subject matter or whether it is published as a printed book.
+ We recommend this License principally for works whose purpose is
+ instruction or reference.
+
+ 1. APPLICABILITY AND DEFINITIONS
+
+ This License applies to any manual or other work, in any medium,
+ that contains a notice placed by the copyright holder saying it
+ can be distributed under the terms of this License. Such a notice
+ grants a world-wide, royalty-free license, unlimited in duration,
+ to use that work under the conditions stated herein. The
+ "Document", below, refers to any such manual or work. Any member
+ of the public is a licensee, and is addressed as "you". You
+ accept the license if you copy, modify or distribute the work in a
+ way requiring permission under copyright law.
+
+ A "Modified Version" of the Document means any work containing the
+ Document or a portion of it, either copied verbatim, or with
+ modifications and/or translated into another language.
+
+ A "Secondary Section" is a named appendix or a front-matter section
+ of the Document that deals exclusively with the relationship of the
+ publishers or authors of the Document to the Document's overall
+ subject (or to related matters) and contains nothing that could
+ fall directly within that overall subject. (Thus, if the Document
+ is in part a textbook of mathematics, a Secondary Section may not
+ explain any mathematics.) The relationship could be a matter of
+ historical connection with the subject or with related matters, or
+ of legal, commercial, philosophical, ethical or political position
+ regarding them.
+
+ The "Invariant Sections" are certain Secondary Sections whose
+ titles are designated, as being those of Invariant Sections, in
+ the notice that says that the Document is released under this
+ License. If a section does not fit the above definition of
+ Secondary then it is not allowed to be designated as Invariant.
+ The Document may contain zero Invariant Sections. If the Document
+ does not identify any Invariant Sections then there are none.
+
+ The "Cover Texts" are certain short passages of text that are
+ listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+ that says that the Document is released under this License. A
+ Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+ be at most 25 words.
+
+ A "Transparent" copy of the Document means a machine-readable copy,
+ represented in a format whose specification is available to the
+ general public, that is suitable for revising the document
+ straightforwardly with generic text editors or (for images
+ composed of pixels) generic paint programs or (for drawings) some
+ widely available drawing editor, and that is suitable for input to
+ text formatters or for automatic translation to a variety of
+ formats suitable for input to text formatters. A copy made in an
+ otherwise Transparent file format whose markup, or absence of
+ markup, has been arranged to thwart or discourage subsequent
+ modification by readers is not Transparent. An image format is
+ not Transparent if used for any substantial amount of text. A
+ copy that is not "Transparent" is called "Opaque".
+
+ Examples of suitable formats for Transparent copies include plain
+ ASCII without markup, Texinfo input format, LaTeX input format,
+ SGML or XML using a publicly available DTD, and
+ standard-conforming simple HTML, PostScript or PDF designed for
+ human modification. Examples of transparent image formats include
+ PNG, XCF and JPG. Opaque formats include proprietary formats that
+ can be read and edited only by proprietary word processors, SGML or
+ XML for which the DTD and/or processing tools are not generally
+ available, and the machine-generated HTML, PostScript or PDF
+ produced by some word processors for output purposes only.
+
+ The "Title Page" means, for a printed book, the title page itself,
+ plus such following pages as are needed to hold, legibly, the
+ material this License requires to appear in the title page. For
+ works in formats which do not have any title page as such, "Title
+ Page" means the text near the most prominent appearance of the
+ work's title, preceding the beginning of the body of the text.
+
+ The "publisher" means any person or entity that distributes copies
+ of the Document to the public.
+
+ A section "Entitled XYZ" means a named subunit of the Document
+ whose title either is precisely XYZ or contains XYZ in parentheses
+ following text that translates XYZ in another language. (Here XYZ
+ stands for a specific section name mentioned below, such as
+ "Acknowledgements", "Dedications", "Endorsements", or "History".)
+ To "Preserve the Title" of such a section when you modify the
+ Document means that it remains a section "Entitled XYZ" according
+ to this definition.
+
+ The Document may include Warranty Disclaimers next to the notice
+ which states that this License applies to the Document. These
+ Warranty Disclaimers are considered to be included by reference in
+ this License, but only as regards disclaiming warranties: any other
+ implication that these Warranty Disclaimers may have is void and
+ has no effect on the meaning of this License.
+
+ 2. VERBATIM COPYING
+
+ You may copy and distribute the Document in any medium, either
+ commercially or noncommercially, provided that this License, the
+ copyright notices, and the license notice saying this License
+ applies to the Document are reproduced in all copies, and that you
+ add no other conditions whatsoever to those of this License. You
+ may not use technical measures to obstruct or control the reading
+ or further copying of the copies you make or distribute. However,
+ you may accept compensation in exchange for copies. If you
+ distribute a large enough number of copies you must also follow
+ the conditions in section 3.
+
+ You may also lend copies, under the same conditions stated above,
+ and you may publicly display copies.
+
+ 3. COPYING IN QUANTITY
+
+ If you publish printed copies (or copies in media that commonly
+ have printed covers) of the Document, numbering more than 100, and
+ the Document's license notice requires Cover Texts, you must
+ enclose the copies in covers that carry, clearly and legibly, all
+ these Cover Texts: Front-Cover Texts on the front cover, and
+ Back-Cover Texts on the back cover. Both covers must also clearly
+ and legibly identify you as the publisher of these copies. The
+ front cover must present the full title with all words of the
+ title equally prominent and visible. You may add other material
+ on the covers in addition. Copying with changes limited to the
+ covers, as long as they preserve the title of the Document and
+ satisfy these conditions, can be treated as verbatim copying in
+ other respects.
+
+ If the required texts for either cover are too voluminous to fit
+ legibly, you should put the first ones listed (as many as fit
+ reasonably) on the actual cover, and continue the rest onto
+ adjacent pages.
+
+ If you publish or distribute Opaque copies of the Document
+ numbering more than 100, you must either include a
+ machine-readable Transparent copy along with each Opaque copy, or
+ state in or with each Opaque copy a computer-network location from
+ which the general network-using public has access to download
+ using public-standard network protocols a complete Transparent
+ copy of the Document, free of added material. If you use the
+ latter option, you must take reasonably prudent steps, when you
+ begin distribution of Opaque copies in quantity, to ensure that
+ this Transparent copy will remain thus accessible at the stated
+ location until at least one year after the last time you
+ distribute an Opaque copy (directly or through your agents or
+ retailers) of that edition to the public.
+
+ It is requested, but not required, that you contact the authors of
+ the Document well before redistributing any large number of
+ copies, to give them a chance to provide you with an updated
+ version of the Document.
+
+ 4. MODIFICATIONS
+
+ You may copy and distribute a Modified Version of the Document
+ under the conditions of sections 2 and 3 above, provided that you
+ release the Modified Version under precisely this License, with
+ the Modified Version filling the role of the Document, thus
+ licensing distribution and modification of the Modified Version to
+ whoever possesses a copy of it. In addition, you must do these
+ things in the Modified Version:
+
+ A. Use in the Title Page (and on the covers, if any) a title
+ distinct from that of the Document, and from those of
+ previous versions (which should, if there were any, be listed
+ in the History section of the Document). You may use the
+ same title as a previous version if the original publisher of
+ that version gives permission.
+
+ B. List on the Title Page, as authors, one or more persons or
+ entities responsible for authorship of the modifications in
+ the Modified Version, together with at least five of the
+ principal authors of the Document (all of its principal
+ authors, if it has fewer than five), unless they release you
+ from this requirement.
+
+ C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+ D. Preserve all the copyright notices of the Document.
+
+ E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+ F. Include, immediately after the copyright notices, a license
+ notice giving the public permission to use the Modified
+ Version under the terms of this License, in the form shown in
+ the Addendum below.
+
+ G. Preserve in that license notice the full lists of Invariant
+ Sections and required Cover Texts given in the Document's
+ license notice.
+
+ H. Include an unaltered copy of this License.
+
+ I. Preserve the section Entitled "History", Preserve its Title,
+ and add to it an item stating at least the title, year, new
+ authors, and publisher of the Modified Version as given on
+ the Title Page. If there is no section Entitled "History" in
+ the Document, create one stating the title, year, authors,
+ and publisher of the Document as given on its Title Page,
+ then add an item describing the Modified Version as stated in
+ the previous sentence.
+
+ J. Preserve the network location, if any, given in the Document
+ for public access to a Transparent copy of the Document, and
+ likewise the network locations given in the Document for
+ previous versions it was based on. These may be placed in
+ the "History" section. You may omit a network location for a
+ work that was published at least four years before the
+ Document itself, or if the original publisher of the version
+ it refers to gives permission.
+
+ K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the
+ section all the substance and tone of each of the contributor
+ acknowledgements and/or dedications given therein.
+
+ L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section
+ titles.
+
+ M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+
+ N. Do not retitle any existing section to be Entitled
+ "Endorsements" or to conflict in title with any Invariant
+ Section.
+
+ O. Preserve any Warranty Disclaimers.
+
+ If the Modified Version includes new front-matter sections or
+ appendices that qualify as Secondary Sections and contain no
+ material copied from the Document, you may at your option
+ designate some or all of these sections as invariant. To do this,
+ add their titles to the list of Invariant Sections in the Modified
+ Version's license notice. These titles must be distinct from any
+ other section titles.
+
+ You may add a section Entitled "Endorsements", provided it contains
+ nothing but endorsements of your Modified Version by various
+ parties--for example, statements of peer review or that the text
+ has been approved by an organization as the authoritative
+ definition of a standard.
+
+ You may add a passage of up to five words as a Front-Cover Text,
+ and a passage of up to 25 words as a Back-Cover Text, to the end
+ of the list of Cover Texts in the Modified Version. Only one
+ passage of Front-Cover Text and one of Back-Cover Text may be
+ added by (or through arrangements made by) any one entity. If the
+ Document already includes a cover text for the same cover,
+ previously added by you or by arrangement made by the same entity
+ you are acting on behalf of, you may not add another; but you may
+ replace the old one, on explicit permission from the previous
+ publisher that added the old one.
+
+ The author(s) and publisher(s) of the Document do not by this
+ License give permission to use their names for publicity for or to
+ assert or imply endorsement of any Modified Version.
+
+ 5. COMBINING DOCUMENTS
+
+ You may combine the Document with other documents released under
+ this License, under the terms defined in section 4 above for
+ modified versions, provided that you include in the combination
+ all of the Invariant Sections of all of the original documents,
+ unmodified, and list them all as Invariant Sections of your
+ combined work in its license notice, and that you preserve all
+ their Warranty Disclaimers.
+
+ The combined work need only contain one copy of this License, and
+ multiple identical Invariant Sections may be replaced with a single
+ copy. If there are multiple Invariant Sections with the same name
+ but different contents, make the title of each such section unique
+ by adding at the end of it, in parentheses, the name of the
+ original author or publisher of that section if known, or else a
+ unique number. Make the same adjustment to the section titles in
+ the list of Invariant Sections in the license notice of the
+ combined work.
+
+ In the combination, you must combine any sections Entitled
+ "History" in the various original documents, forming one section
+ Entitled "History"; likewise combine any sections Entitled
+ "Acknowledgements", and any sections Entitled "Dedications". You
+ must delete all sections Entitled "Endorsements."
+
+ 6. COLLECTIONS OF DOCUMENTS
+
+ You may make a collection consisting of the Document and other
+ documents released under this License, and replace the individual
+ copies of this License in the various documents with a single copy
+ that is included in the collection, provided that you follow the
+ rules of this License for verbatim copying of each of the
+ documents in all other respects.
+
+ You may extract a single document from such a collection, and
+ distribute it individually under this License, provided you insert
+ a copy of this License into the extracted document, and follow
+ this License in all other respects regarding verbatim copying of
+ that document.
+
+ 7. AGGREGATION WITH INDEPENDENT WORKS
+
+ A compilation of the Document or its derivatives with other
+ separate and independent documents or works, in or on a volume of
+ a storage or distribution medium, is called an "aggregate" if the
+ copyright resulting from the compilation is not used to limit the
+ legal rights of the compilation's users beyond what the individual
+ works permit. When the Document is included in an aggregate, this
+ License does not apply to the other works in the aggregate which
+ are not themselves derivative works of the Document.
+
+ If the Cover Text requirement of section 3 is applicable to these
+ copies of the Document, then if the Document is less than one half
+ of the entire aggregate, the Document's Cover Texts may be placed
+ on covers that bracket the Document within the aggregate, or the
+ electronic equivalent of covers if the Document is in electronic
+ form. Otherwise they must appear on printed covers that bracket
+ the whole aggregate.
+
+ 8. TRANSLATION
+
+ Translation is considered a kind of modification, so you may
+ distribute translations of the Document under the terms of section
+ 4. Replacing Invariant Sections with translations requires special
+ permission from their copyright holders, but you may include
+ translations of some or all Invariant Sections in addition to the
+ original versions of these Invariant Sections. You may include a
+ translation of this License, and all the license notices in the
+ Document, and any Warranty Disclaimers, provided that you also
+ include the original English version of this License and the
+ original versions of those notices and disclaimers. In case of a
+ disagreement between the translation and the original version of
+ this License or a notice or disclaimer, the original version will
+ prevail.
+
+ If a section in the Document is Entitled "Acknowledgements",
+ "Dedications", or "History", the requirement (section 4) to
+ Preserve its Title (section 1) will typically require changing the
+ actual title.
+
+ 9. TERMINATION
+
+ You may not copy, modify, sublicense, or distribute the Document
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense, or distribute it is void,
+ and will automatically terminate your rights under this License.
+
+ However, if you cease all violation of this License, then your
+ license from a particular copyright holder is reinstated (a)
+ provisionally, unless and until the copyright holder explicitly
+ and finally terminates your license, and (b) permanently, if the
+ copyright holder fails to notify you of the violation by some
+ reasonable means prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+ reinstated permanently if the copyright holder notifies you of the
+ violation by some reasonable means, this is the first time you have
+ received notice of violation of this License (for any work) from
+ that copyright holder, and you cure the violation prior to 30 days
+ after your receipt of the notice.
+
+ Termination of your rights under this section does not terminate
+ the licenses of parties who have received copies or rights from
+ you under this License. If your rights have been terminated and
+ not permanently reinstated, receipt of a copy of some or all of
+ the same material does not give you any rights to use it.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+ The Free Software Foundation may publish new, revised versions of
+ the GNU Free Documentation License from time to time. Such new
+ versions will be similar in spirit to the present version, but may
+ differ in detail to address new problems or concerns. See
+ `http://www.gnu.org/copyleft/'.
+
+ Each version of the License is given a distinguishing version
+ number. If the Document specifies that a particular numbered
+ version of this License "or any later version" applies to it, you
+ have the option of following the terms and conditions either of
+ that specified version or of any later version that has been
+ published (not as a draft) by the Free Software Foundation. If
+ the Document does not specify a version number of this License,
+ you may choose any version ever published (not as a draft) by the
+ Free Software Foundation. If the Document specifies that a proxy
+ can decide which future versions of this License can be used, that
+ proxy's public statement of acceptance of a version permanently
+ authorizes you to choose that version for the Document.
+
+ 11. RELICENSING
+
+ "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+ World Wide Web server that publishes copyrightable works and also
+ provides prominent facilities for anybody to edit those works. A
+ public wiki that anybody can edit is an example of such a server.
+ A "Massive Multiauthor Collaboration" (or "MMC") contained in the
+ site means any set of copyrightable works thus published on the MMC
+ site.
+
+ "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+ license published by Creative Commons Corporation, a not-for-profit
+ corporation with a principal place of business in San Francisco,
+ California, as well as future copyleft versions of that license
+ published by that same organization.
+
+ "Incorporate" means to publish or republish a Document, in whole or
+ in part, as part of another Document.
+
+ An MMC is "eligible for relicensing" if it is licensed under this
+ License, and if all works that were first published under this
+ License somewhere other than this MMC, and subsequently
+ incorporated in whole or in part into the MMC, (1) had no cover
+ texts or invariant sections, and (2) were thus incorporated prior
+ to November 1, 2008.
+
+ The operator of an MMC Site may republish an MMC contained in the
+ site under CC-BY-SA on the same site at any time before August 1,
+ 2009, provided the MMC is eligible for relicensing.
+
+
+ADDENDUM: How to use this License for your documents
+====================================================
+
+ To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+ Copyright (C) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+
+ If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with
+ the Front-Cover Texts being LIST, and with the Back-Cover Texts
+ being LIST.
+
+ If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+ If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+
+File: libunistring.info, Node: Index, Prev: Licenses, Up: Top
+
+Index
+*****
+
+
+* Menu:
+
+* ambiguous width: uniwidth.h. (line 10)
+* argument conventions: Conventions. (line 9)
+* autoconf macro: Autoconf macro. (line 6)
+* bidirectional category: Bidirectional category.
+ (line 6)
+* bidirectional reordering: More functionality. (line 6)
+* block: Blocks. (line 6)
+* breaks, line: unilbrk.h. (line 6)
+* breaks, word: uniwbrk.h. (line 6)
+* bug reports: Reporting problems. (line 6)
+* bug tracker: Reporting problems. (line 6)
+* C string functions: char * strings. (line 6)
+* C, programming language: ISO C and Java syntax.
+ (line 6)
+* C-like API: Classifications like in ISO C.
+ (line 6)
+* canonical combining class: Canonical combining class.
+ (line 6)
+* case detection: Case detection. (line 6)
+* case mappings: Case mappings of strings.
+ (line 6)
+* casing_prefix_context_t: Case mappings of substrings.
+ (line 15)
+* casing_suffix_context_t: Case mappings of substrings.
+ (line 46)
+* char, type: char * strings. (line 23)
+* combining, Unicode characters: Composition of characters.
+ (line 6)
+* comparing <1>: Elementary string functions on NUL terminated strings.
+ (line 128)
+* comparing: Elementary string functions.
+ (line 108)
+* comparing, ignoring case: Case insensitive comparison.
+ (line 6)
+* comparing, ignoring case, with collation rules: Case insensitive comparison.
+ (line 66)
+* comparing, ignoring normalization: Normalizing comparisons.
+ (line 6)
+* comparing, ignoring normalization and case: Case insensitive comparison.
+ (line 6)
+* comparing, ignoring normalization and case, with collation rules: Case insensitive comparison.
+ (line 66)
+* comparing, ignoring normalization, with collation rules: Normalizing comparisons.
+ (line 23)
+* comparing, with collation rules: Elementary string functions on NUL terminated strings.
+ (line 140)
+* comparing, with collation rules, ignoring case: Case insensitive comparison.
+ (line 66)
+* comparing, with collation rules, ignoring normalization: Normalizing comparisons.
+ (line 23)
+* comparing, with collation rules, ignoring normalization and case: Case insensitive comparison.
+ (line 66)
+* compiler options: Compiler options. (line 24)
+* composing, Unicode characters: Composition of characters.
+ (line 6)
+* converting <1>: uniconv.h. (line 45)
+* converting: Elementary string conversions.
+ (line 6)
+* copying <1>: Elementary string functions on NUL terminated strings.
+ (line 61)
+* copying: Elementary string functions.
+ (line 72)
+* counting: Elementary string functions.
+ (line 153)
+* decomposing: Decomposition of characters.
+ (line 6)
+* dependencies: Installation. (line 6)
+* detecting case: Case detection. (line 6)
+* duplicating <1>: Elementary string functions on NUL terminated strings.
+ (line 166)
+* duplicating: Elementary string functions with memory allocation.
+ (line 6)
+* enum iconv_ilseq_handler: uniconv.h. (line 30)
+* FDL, GNU Free Documentation License: GNU FDL. (line 6)
+* formatted output: unistdio.h. (line 6)
+* fullwidth: uniwidth.h. (line 22)
+* general category: General category. (line 6)
+* gl_LIBUNISTRING: Autoconf macro. (line 11)
+* GPL, GNU General Public License: GNU GPL. (line 6)
+* halfwidth: uniwidth.h. (line 22)
+* identifiers: ISO C and Java syntax.
+ (line 6)
+* installation: Installation. (line 10)
+* internationalization: Unicode and i18n. (line 6)
+* iterating <1>: Elementary string functions on NUL terminated strings.
+ (line 15)
+* iterating: Elementary string functions.
+ (line 6)
+* Java, programming language: ISO C and Java syntax.
+ (line 6)
+* LGPL, GNU Lesser General Public License: GNU LGPL. (line 6)
+* License, GNU FDL: GNU FDL. (line 6)
+* License, GNU GPL: GNU GPL. (line 6)
+* License, GNU LGPL: GNU LGPL. (line 6)
+* Licenses: Licenses. (line 6)
+* line breaks: unilbrk.h. (line 6)
+* locale: Locale encodings. (line 6)
+* locale categories: Locale encodings. (line 10)
+* locale encoding <1>: uniconv.h. (line 10)
+* locale encoding: Locale encodings. (line 28)
+* locale language: Case mappings of strings.
+ (line 16)
+* locale, multibyte: char * strings. (line 13)
+* locale_charset: uniconv.h. (line 13)
+* lowercasing: Case mappings of strings.
+ (line 6)
+* mailing list: Reporting problems. (line 6)
+* mirroring, of Unicode character: Mirrored character. (line 6)
+* normal forms: uninorm.h. (line 6)
+* normalizing: uninorm.h. (line 6)
+* output, formatted: unistdio.h. (line 6)
+* properties, of Unicode character: Properties. (line 6)
+* regular expression: uniregex.h. (line 6)
+* rendering: More functionality. (line 9)
+* return value conventions: Conventions. (line 47)
+* scripts: Scripts. (line 6)
+* searching, for a character <1>: Elementary string functions on NUL terminated strings.
+ (line 176)
+* searching, for a character: Elementary string functions.
+ (line 140)
+* searching, for a substring: Elementary string functions on NUL terminated strings.
+ (line 232)
+* stream, normalizing a: Normalization of streams.
+ (line 6)
+* struct uninorm_filter: Normalization of streams.
+ (line 11)
+* titlecasing: Case mappings of strings.
+ (line 6)
+* u16_asnprintf: unistdio.h. (line 132)
+* u16_asprintf: unistdio.h. (line 129)
+* u16_casecmp: Case insensitive comparison.
+ (line 51)
+* u16_casecoll: Case insensitive comparison.
+ (line 95)
+* u16_casefold: Case insensitive comparison.
+ (line 15)
+* u16_casexfrm: Case insensitive comparison.
+ (line 75)
+* u16_casing_prefix_context: Case mappings of substrings.
+ (line 30)
+* u16_casing_prefixes_context: Case mappings of substrings.
+ (line 39)
+* u16_casing_suffix_context: Case mappings of substrings.
+ (line 61)
+* u16_casing_suffixes_context: Case mappings of substrings.
+ (line 70)
+* u16_check: Elementary string checks.
+ (line 11)
+* u16_chr: Elementary string functions.
+ (line 145)
+* u16_cmp: Elementary string functions.
+ (line 115)
+* u16_cmp2: Elementary string functions.
+ (line 131)
+* u16_conv_from_encoding: uniconv.h. (line 54)
+* u16_conv_to_encoding: uniconv.h. (line 91)
+* u16_cpy: Elementary string functions.
+ (line 78)
+* u16_cpy_alloc: Elementary string functions with memory allocation.
+ (line 10)
+* u16_ct_casefold: Case insensitive comparison.
+ (line 37)
+* u16_ct_tolower: Case mappings of substrings.
+ (line 107)
+* u16_ct_totitle: Case mappings of substrings.
+ (line 125)
+* u16_ct_toupper: Case mappings of substrings.
+ (line 89)
+* u16_endswith: Elementary string functions on NUL terminated strings.
+ (line 258)
+* u16_is_cased: Case detection. (line 57)
+* u16_is_casefolded: Case detection. (line 44)
+* u16_is_lowercase: Case detection. (line 24)
+* u16_is_titlecase: Case detection. (line 34)
+* u16_is_uppercase: Case detection. (line 14)
+* u16_mblen: Elementary string functions.
+ (line 11)
+* u16_mbsnlen: Elementary string functions.
+ (line 157)
+* u16_mbtouc: Elementary string functions.
+ (line 38)
+* u16_mbtouc_unsafe: Elementary string functions.
+ (line 23)
+* u16_mbtoucr: Elementary string functions.
+ (line 45)
+* u16_move: Elementary string functions.
+ (line 89)
+* u16_next: Elementary string functions on NUL terminated strings.
+ (line 24)
+* u16_normalize: Normalization of strings.
+ (line 50)
+* u16_normcmp: Normalizing comparisons.
+ (line 13)
+* u16_normcoll: Normalizing comparisons.
+ (line 40)
+* u16_normxfrm: Normalizing comparisons.
+ (line 27)
+* u16_possible_linebreaks: unilbrk.h. (line 46)
+* u16_prev: Elementary string functions on NUL terminated strings.
+ (line 36)
+* u16_set: Elementary string functions.
+ (line 101)
+* u16_snprintf: unistdio.h. (line 126)
+* u16_sprintf: unistdio.h. (line 123)
+* u16_startswith: Elementary string functions on NUL terminated strings.
+ (line 250)
+* u16_stpcpy: Elementary string functions on NUL terminated strings.
+ (line 76)
+* u16_stpncpy: Elementary string functions on NUL terminated strings.
+ (line 99)
+* u16_strcat: Elementary string functions on NUL terminated strings.
+ (line 110)
+* u16_strchr: Elementary string functions on NUL terminated strings.
+ (line 180)
+* u16_strcmp: Elementary string functions on NUL terminated strings.
+ (line 132)
+* u16_strcoll: Elementary string functions on NUL terminated strings.
+ (line 142)
+* u16_strconv_from_encoding: uniconv.h. (line 129)
+* u16_strconv_from_locale: uniconv.h. (line 157)
+* u16_strconv_to_encoding: uniconv.h. (line 142)
+* u16_strconv_to_locale: uniconv.h. (line 167)
+* u16_strcpy: Elementary string functions on NUL terminated strings.
+ (line 66)
+* u16_strcspn: Elementary string functions on NUL terminated strings.
+ (line 201)
+* u16_strdup: Elementary string functions on NUL terminated strings.
+ (line 170)
+* u16_strlen: Elementary string functions on NUL terminated strings.
+ (line 47)
+* u16_strmblen: Elementary string functions on NUL terminated strings.
+ (line 11)
+* u16_strmbtouc: Elementary string functions on NUL terminated strings.
+ (line 17)
+* u16_strncat: Elementary string functions on NUL terminated strings.
+ (line 121)
+* u16_strncmp: Elementary string functions on NUL terminated strings.
+ (line 159)
+* u16_strncpy: Elementary string functions on NUL terminated strings.
+ (line 88)
+* u16_strnlen: Elementary string functions on NUL terminated strings.
+ (line 55)
+* u16_strpbrk: Elementary string functions on NUL terminated strings.
+ (line 225)
+* u16_strrchr: Elementary string functions on NUL terminated strings.
+ (line 188)
+* u16_strspn: Elementary string functions on NUL terminated strings.
+ (line 213)
+* u16_strstr: Elementary string functions on NUL terminated strings.
+ (line 239)
+* u16_strtok: Elementary string functions on NUL terminated strings.
+ (line 268)
+* u16_strwidth: uniwidth.h. (line 39)
+* u16_to_u32: Elementary string conversions.
+ (line 23)
+* u16_to_u8: Elementary string conversions.
+ (line 19)
+* u16_tolower: Case mappings of strings.
+ (line 44)
+* u16_totitle: Case mappings of strings.
+ (line 58)
+* u16_toupper: Case mappings of strings.
+ (line 30)
+* u16_u16_asnprintf: unistdio.h. (line 159)
+* u16_u16_asprintf: unistdio.h. (line 156)
+* u16_u16_snprintf: unistdio.h. (line 153)
+* u16_u16_sprintf: unistdio.h. (line 150)
+* u16_u16_vasnprintf: unistdio.h. (line 171)
+* u16_u16_vasprintf: unistdio.h. (line 168)
+* u16_u16_vsnprintf: unistdio.h. (line 165)
+* u16_u16_vsprintf: unistdio.h. (line 162)
+* u16_uctomb: Elementary string functions.
+ (line 62)
+* u16_vasnprintf: unistdio.h. (line 144)
+* u16_vasprintf: unistdio.h. (line 141)
+* u16_vsnprintf: unistdio.h. (line 138)
+* u16_vsprintf: unistdio.h. (line 135)
+* u16_width: uniwidth.h. (line 31)
+* u16_width_linebreaks: unilbrk.h. (line 65)
+* u16_wordbreaks: Word breaks in a string.
+ (line 10)
+* u32_asnprintf: unistdio.h. (line 185)
+* u32_asprintf: unistdio.h. (line 182)
+* u32_casecmp: Case insensitive comparison.
+ (line 54)
+* u32_casecoll: Case insensitive comparison.
+ (line 98)
+* u32_casefold: Case insensitive comparison.
+ (line 18)
+* u32_casexfrm: Case insensitive comparison.
+ (line 78)
+* u32_casing_prefix_context: Case mappings of substrings.
+ (line 32)
+* u32_casing_prefixes_context: Case mappings of substrings.
+ (line 42)
+* u32_casing_suffix_context: Case mappings of substrings.
+ (line 63)
+* u32_casing_suffixes_context: Case mappings of substrings.
+ (line 73)
+* u32_check: Elementary string checks.
+ (line 12)
+* u32_chr: Elementary string functions.
+ (line 147)
+* u32_cmp: Elementary string functions.
+ (line 117)
+* u32_cmp2: Elementary string functions.
+ (line 133)
+* u32_conv_from_encoding: uniconv.h. (line 57)
+* u32_conv_to_encoding: uniconv.h. (line 94)
+* u32_cpy: Elementary string functions.
+ (line 80)
+* u32_cpy_alloc: Elementary string functions with memory allocation.
+ (line 11)
+* u32_ct_casefold: Case insensitive comparison.
+ (line 42)
+* u32_ct_tolower: Case mappings of substrings.
+ (line 112)
+* u32_ct_totitle: Case mappings of substrings.
+ (line 130)
+* u32_ct_toupper: Case mappings of substrings.
+ (line 94)
+* u32_endswith: Elementary string functions on NUL terminated strings.
+ (line 260)
+* u32_is_cased: Case detection. (line 59)
+* u32_is_casefolded: Case detection. (line 46)
+* u32_is_lowercase: Case detection. (line 26)
+* u32_is_titlecase: Case detection. (line 36)
+* u32_is_uppercase: Case detection. (line 16)
+* u32_mblen: Elementary string functions.
+ (line 12)
+* u32_mbsnlen: Elementary string functions.
+ (line 158)
+* u32_mbtouc: Elementary string functions.
+ (line 39)
+* u32_mbtouc_unsafe: Elementary string functions.
+ (line 25)
+* u32_mbtoucr: Elementary string functions.
+ (line 46)
+* u32_move: Elementary string functions.
+ (line 91)
+* u32_next: Elementary string functions on NUL terminated strings.
+ (line 25)
+* u32_normalize: Normalization of strings.
+ (line 52)
+* u32_normcmp: Normalizing comparisons.
+ (line 15)
+* u32_normcoll: Normalizing comparisons.
+ (line 42)
+* u32_normxfrm: Normalizing comparisons.
+ (line 29)
+* u32_possible_linebreaks: unilbrk.h. (line 48)
+* u32_prev: Elementary string functions on NUL terminated strings.
+ (line 38)
+* u32_set: Elementary string functions.
+ (line 102)
+* u32_snprintf: unistdio.h. (line 179)
+* u32_sprintf: unistdio.h. (line 176)
+* u32_startswith: Elementary string functions on NUL terminated strings.
+ (line 252)
+* u32_stpcpy: Elementary string functions on NUL terminated strings.
+ (line 78)
+* u32_stpncpy: Elementary string functions on NUL terminated strings.
+ (line 101)
+* u32_strcat: Elementary string functions on NUL terminated strings.
+ (line 112)
+* u32_strchr: Elementary string functions on NUL terminated strings.
+ (line 181)
+* u32_strcmp: Elementary string functions on NUL terminated strings.
+ (line 133)
+* u32_strcoll: Elementary string functions on NUL terminated strings.
+ (line 143)
+* u32_strconv_from_encoding: uniconv.h. (line 131)
+* u32_strconv_from_locale: uniconv.h. (line 158)
+* u32_strconv_to_encoding: uniconv.h. (line 144)
+* u32_strconv_to_locale: uniconv.h. (line 168)
+* u32_strcpy: Elementary string functions on NUL terminated strings.
+ (line 68)
+* u32_strcspn: Elementary string functions on NUL terminated strings.
+ (line 203)
+* u32_strdup: Elementary string functions on NUL terminated strings.
+ (line 171)
+* u32_strlen: Elementary string functions on NUL terminated strings.
+ (line 48)
+* u32_strmblen: Elementary string functions on NUL terminated strings.
+ (line 12)
+* u32_strmbtouc: Elementary string functions on NUL terminated strings.
+ (line 18)
+* u32_strncat: Elementary string functions on NUL terminated strings.
+ (line 123)
+* u32_strncmp: Elementary string functions on NUL terminated strings.
+ (line 161)
+* u32_strncpy: Elementary string functions on NUL terminated strings.
+ (line 90)
+* u32_strnlen: Elementary string functions on NUL terminated strings.
+ (line 56)
+* u32_strpbrk: Elementary string functions on NUL terminated strings.
+ (line 227)
+* u32_strrchr: Elementary string functions on NUL terminated strings.
+ (line 189)
+* u32_strspn: Elementary string functions on NUL terminated strings.
+ (line 215)
+* u32_strstr: Elementary string functions on NUL terminated strings.
+ (line 241)
+* u32_strtok: Elementary string functions on NUL terminated strings.
+ (line 270)
+* u32_strwidth: uniwidth.h. (line 40)
+* u32_to_u16: Elementary string conversions.
+ (line 31)
+* u32_to_u8: Elementary string conversions.
+ (line 27)
+* u32_tolower: Case mappings of strings.
+ (line 47)
+* u32_totitle: Case mappings of strings.
+ (line 61)
+* u32_toupper: Case mappings of strings.
+ (line 33)
+* u32_u32_asnprintf: unistdio.h. (line 212)
+* u32_u32_asprintf: unistdio.h. (line 209)
+* u32_u32_snprintf: unistdio.h. (line 206)
+* u32_u32_sprintf: unistdio.h. (line 203)
+* u32_u32_vasnprintf: unistdio.h. (line 224)
+* u32_u32_vasprintf: unistdio.h. (line 221)
+* u32_u32_vsnprintf: unistdio.h. (line 218)
+* u32_u32_vsprintf: unistdio.h. (line 215)
+* u32_uctomb: Elementary string functions.
+ (line 63)
+* u32_vasnprintf: unistdio.h. (line 197)
+* u32_vasprintf: unistdio.h. (line 194)
+* u32_vsnprintf: unistdio.h. (line 191)
+* u32_vsprintf: unistdio.h. (line 188)
+* u32_width: uniwidth.h. (line 33)
+* u32_width_linebreaks: unilbrk.h. (line 68)
+* u32_wordbreaks: Word breaks in a string.
+ (line 11)
+* u8_asnprintf: unistdio.h. (line 79)
+* u8_asprintf: unistdio.h. (line 76)
+* u8_casecmp: Case insensitive comparison.
+ (line 48)
+* u8_casecoll: Case insensitive comparison.
+ (line 92)
+* u8_casefold: Case insensitive comparison.
+ (line 12)
+* u8_casexfrm: Case insensitive comparison.
+ (line 72)
+* u8_casing_prefix_context: Case mappings of substrings.
+ (line 28)
+* u8_casing_prefixes_context: Case mappings of substrings.
+ (line 36)
+* u8_casing_suffix_context: Case mappings of substrings.
+ (line 59)
+* u8_casing_suffixes_context: Case mappings of substrings.
+ (line 67)
+* u8_check: Elementary string checks.
+ (line 10)
+* u8_chr: Elementary string functions.
+ (line 143)
+* u8_cmp: Elementary string functions.
+ (line 113)
+* u8_cmp2: Elementary string functions.
+ (line 129)
+* u8_conv_from_encoding: uniconv.h. (line 51)
+* u8_conv_to_encoding: uniconv.h. (line 88)
+* u8_cpy: Elementary string functions.
+ (line 76)
+* u8_cpy_alloc: Elementary string functions with memory allocation.
+ (line 9)
+* u8_ct_casefold: Case insensitive comparison.
+ (line 32)
+* u8_ct_tolower: Case mappings of substrings.
+ (line 102)
+* u8_ct_totitle: Case mappings of substrings.
+ (line 120)
+* u8_ct_toupper: Case mappings of substrings.
+ (line 84)
+* u8_endswith: Elementary string functions on NUL terminated strings.
+ (line 256)
+* u8_is_cased: Case detection. (line 55)
+* u8_is_casefolded: Case detection. (line 42)
+* u8_is_lowercase: Case detection. (line 22)
+* u8_is_titlecase: Case detection. (line 32)
+* u8_is_uppercase: Case detection. (line 12)
+* u8_mblen: Elementary string functions.
+ (line 10)
+* u8_mbsnlen: Elementary string functions.
+ (line 156)
+* u8_mbtouc: Elementary string functions.
+ (line 37)
+* u8_mbtouc_unsafe: Elementary string functions.
+ (line 21)
+* u8_mbtoucr: Elementary string functions.
+ (line 44)
+* u8_move: Elementary string functions.
+ (line 87)
+* u8_next: Elementary string functions on NUL terminated strings.
+ (line 23)
+* u8_normalize: Normalization of strings.
+ (line 48)
+* u8_normcmp: Normalizing comparisons.
+ (line 11)
+* u8_normcoll: Normalizing comparisons.
+ (line 38)
+* u8_normxfrm: Normalizing comparisons.
+ (line 25)
+* u8_possible_linebreaks: unilbrk.h. (line 44)
+* u8_prev: Elementary string functions on NUL terminated strings.
+ (line 34)
+* u8_set: Elementary string functions.
+ (line 100)
+* u8_snprintf: unistdio.h. (line 73)
+* u8_sprintf: unistdio.h. (line 70)
+* u8_startswith: Elementary string functions on NUL terminated strings.
+ (line 248)
+* u8_stpcpy: Elementary string functions on NUL terminated strings.
+ (line 74)
+* u8_stpncpy: Elementary string functions on NUL terminated strings.
+ (line 97)
+* u8_strcat: Elementary string functions on NUL terminated strings.
+ (line 108)
+* u8_strchr: Elementary string functions on NUL terminated strings.
+ (line 179)
+* u8_strcmp: Elementary string functions on NUL terminated strings.
+ (line 131)
+* u8_strcoll: Elementary string functions on NUL terminated strings.
+ (line 141)
+* u8_strconv_from_encoding: uniconv.h. (line 127)
+* u8_strconv_from_locale: uniconv.h. (line 156)
+* u8_strconv_to_encoding: uniconv.h. (line 140)
+* u8_strconv_to_locale: uniconv.h. (line 166)
+* u8_strcpy: Elementary string functions on NUL terminated strings.
+ (line 64)
+* u8_strcspn: Elementary string functions on NUL terminated strings.
+ (line 199)
+* u8_strdup: Elementary string functions on NUL terminated strings.
+ (line 169)
+* u8_strlen: Elementary string functions on NUL terminated strings.
+ (line 46)
+* u8_strmblen: Elementary string functions on NUL terminated strings.
+ (line 10)
+* u8_strmbtouc: Elementary string functions on NUL terminated strings.
+ (line 16)
+* u8_strncat: Elementary string functions on NUL terminated strings.
+ (line 119)
+* u8_strncmp: Elementary string functions on NUL terminated strings.
+ (line 157)
+* u8_strncpy: Elementary string functions on NUL terminated strings.
+ (line 86)
+* u8_strnlen: Elementary string functions on NUL terminated strings.
+ (line 54)
+* u8_strpbrk: Elementary string functions on NUL terminated strings.
+ (line 223)
+* u8_strrchr: Elementary string functions on NUL terminated strings.
+ (line 187)
+* u8_strspn: Elementary string functions on NUL terminated strings.
+ (line 211)
+* u8_strstr: Elementary string functions on NUL terminated strings.
+ (line 237)
+* u8_strtok: Elementary string functions on NUL terminated strings.
+ (line 266)
+* u8_strwidth: uniwidth.h. (line 38)
+* u8_to_u16: Elementary string conversions.
+ (line 11)
+* u8_to_u32: Elementary string conversions.
+ (line 15)
+* u8_tolower: Case mappings of strings.
+ (line 41)
+* u8_totitle: Case mappings of strings.
+ (line 55)
+* u8_toupper: Case mappings of strings.
+ (line 27)
+* u8_u8_asnprintf: unistdio.h. (line 106)
+* u8_u8_asprintf: unistdio.h. (line 103)
+* u8_u8_snprintf: unistdio.h. (line 100)
+* u8_u8_sprintf: unistdio.h. (line 97)
+* u8_u8_vasnprintf: unistdio.h. (line 118)
+* u8_u8_vasprintf: unistdio.h. (line 115)
+* u8_u8_vsnprintf: unistdio.h. (line 112)
+* u8_u8_vsprintf: unistdio.h. (line 109)
+* u8_uctomb: Elementary string functions.
+ (line 61)
+* u8_vasnprintf: unistdio.h. (line 91)
+* u8_vasprintf: unistdio.h. (line 88)
+* u8_vsnprintf: unistdio.h. (line 85)
+* u8_vsprintf: unistdio.h. (line 82)
+* u8_width: uniwidth.h. (line 29)
+* u8_width_linebreaks: unilbrk.h. (line 62)
+* u8_wordbreaks: Word breaks in a string.
+ (line 9)
+* uc_all_blocks: Blocks. (line 38)
+* uc_all_scripts: Scripts. (line 37)
+* uc_bidi_category: Bidirectional category.
+ (line 88)
+* uc_bidi_category_byname: Bidirectional category.
+ (line 82)
+* uc_bidi_category_name: Bidirectional category.
+ (line 79)
+* uc_block: Blocks. (line 27)
+* uc_block_t: Blocks. (line 12)
+* uc_c_ident_category: ISO C and Java syntax.
+ (line 39)
+* uc_canonical_decomposition: Decomposition of characters.
+ (line 92)
+* uc_combining_class: Canonical combining class.
+ (line 89)
+* uc_composition: Composition of characters.
+ (line 10)
+* uc_decimal_value: Decimal digit value. (line 11)
+* uc_decomposition: Decomposition of characters.
+ (line 82)
+* uc_digit_value: Digit value. (line 11)
+* uc_fraction_t: Numeric value. (line 14)
+* uc_general_category: Object oriented API. (line 207)
+* uc_general_category_and: Object oriented API. (line 179)
+* uc_general_category_and_not: Object oriented API. (line 186)
+* uc_general_category_byname: Object oriented API. (line 201)
+* uc_general_category_name: Object oriented API. (line 195)
+* uc_general_category_or: Object oriented API. (line 173)
+* uc_general_category_t: Object oriented API. (line 7)
+* uc_is_alnum: Classifications like in ISO C.
+ (line 14)
+* uc_is_alpha: Classifications like in ISO C.
+ (line 18)
+* uc_is_bidi_category: Bidirectional category.
+ (line 91)
+* uc_is_blank: Classifications like in ISO C.
+ (line 64)
+* uc_is_block: Blocks. (line 32)
+* uc_is_c_whitespace: ISO C and Java syntax.
+ (line 10)
+* uc_is_cntrl: Classifications like in ISO C.
+ (line 24)
+* uc_is_digit: Classifications like in ISO C.
+ (line 27)
+* uc_is_general_category: Object oriented API. (line 213)
+* uc_is_general_category_withtable: Bit mask API. (line 52)
+* uc_is_graph: Classifications like in ISO C.
+ (line 31)
+* uc_is_java_whitespace: ISO C and Java syntax.
+ (line 14)
+* uc_is_lower: Classifications like in ISO C.
+ (line 35)
+* uc_is_print: Classifications like in ISO C.
+ (line 41)
+* uc_is_property: Properties as objects.
+ (line 140)
+* uc_is_property_alphabetic: Properties as functions.
+ (line 10)
+* uc_is_property_ascii_hex_digit: Properties as functions.
+ (line 74)
+* uc_is_property_bidi_arabic_digit: Properties as functions.
+ (line 60)
+* uc_is_property_bidi_arabic_right_to_left: Properties as functions.
+ (line 56)
+* uc_is_property_bidi_block_separator: Properties as functions.
+ (line 62)
+* uc_is_property_bidi_boundary_neutral: Properties as functions.
+ (line 66)
+* uc_is_property_bidi_common_separator: Properties as functions.
+ (line 61)
+* uc_is_property_bidi_control: Properties as functions.
+ (line 53)
+* uc_is_property_bidi_embedding_or_override: Properties as functions.
+ (line 68)
+* uc_is_property_bidi_eur_num_separator: Properties as functions.
+ (line 58)
+* uc_is_property_bidi_eur_num_terminator: Properties as functions.
+ (line 59)
+* uc_is_property_bidi_european_digit: Properties as functions.
+ (line 57)
+* uc_is_property_bidi_hebrew_right_to_left: Properties as functions.
+ (line 55)
+* uc_is_property_bidi_left_to_right: Properties as functions.
+ (line 54)
+* uc_is_property_bidi_non_spacing_mark: Properties as functions.
+ (line 65)
+* uc_is_property_bidi_other_neutral: Properties as functions.
+ (line 69)
+* uc_is_property_bidi_pdf: Properties as functions.
+ (line 67)
+* uc_is_property_bidi_segment_separator: Properties as functions.
+ (line 63)
+* uc_is_property_bidi_whitespace: Properties as functions.
+ (line 64)
+* uc_is_property_combining: Properties as functions.
+ (line 104)
+* uc_is_property_composite: Properties as functions.
+ (line 105)
+* uc_is_property_currency_symbol: Properties as functions.
+ (line 99)
+* uc_is_property_dash: Properties as functions.
+ (line 91)
+* uc_is_property_decimal_digit: Properties as functions.
+ (line 106)
+* uc_is_property_default_ignorable_code_point: Properties as functions.
+ (line 14)
+* uc_is_property_deprecated: Properties as functions.
+ (line 17)
+* uc_is_property_diacritic: Properties as functions.
+ (line 108)
+* uc_is_property_extender: Properties as functions.
+ (line 109)
+* uc_is_property_format_control: Properties as functions.
+ (line 90)
+* uc_is_property_grapheme_base: Properties as functions.
+ (line 46)
+* uc_is_property_grapheme_extend: Properties as functions.
+ (line 47)
+* uc_is_property_grapheme_link: Properties as functions.
+ (line 49)
+* uc_is_property_hex_digit: Properties as functions.
+ (line 73)
+* uc_is_property_hyphen: Properties as functions.
+ (line 92)
+* uc_is_property_id_continue: Properties as functions.
+ (line 36)
+* uc_is_property_id_start: Properties as functions.
+ (line 34)
+* uc_is_property_ideographic: Properties as functions.
+ (line 78)
+* uc_is_property_ids_binary_operator: Properties as functions.
+ (line 81)
+* uc_is_property_ids_trinary_operator: Properties as functions.
+ (line 82)
+* uc_is_property_ignorable_control: Properties as functions.
+ (line 110)
+* uc_is_property_iso_control: Properties as functions.
+ (line 89)
+* uc_is_property_join_control: Properties as functions.
+ (line 45)
+* uc_is_property_left_of_pair: Properties as functions.
+ (line 103)
+* uc_is_property_line_separator: Properties as functions.
+ (line 94)
+* uc_is_property_logical_order_exception: Properties as functions.
+ (line 18)
+* uc_is_property_lowercase: Properties as functions.
+ (line 27)
+* uc_is_property_math: Properties as functions.
+ (line 100)
+* uc_is_property_non_break: Properties as functions.
+ (line 88)
+* uc_is_property_not_a_character: Properties as functions.
+ (line 12)
+* uc_is_property_numeric: Properties as functions.
+ (line 107)
+* uc_is_property_other_alphabetic: Properties as functions.
+ (line 11)
+* uc_is_property_other_default_ignorable_code_point: Properties as functions.
+ (line 16)
+* uc_is_property_other_grapheme_extend: Properties as functions.
+ (line 48)
+* uc_is_property_other_id_continue: Properties as functions.
+ (line 37)
+* uc_is_property_other_id_start: Properties as functions.
+ (line 35)
+* uc_is_property_other_lowercase: Properties as functions.
+ (line 28)
+* uc_is_property_other_math: Properties as functions.
+ (line 101)
+* uc_is_property_other_uppercase: Properties as functions.
+ (line 26)
+* uc_is_property_paired_punctuation: Properties as functions.
+ (line 102)
+* uc_is_property_paragraph_separator: Properties as functions.
+ (line 95)
+* uc_is_property_pattern_syntax: Properties as functions.
+ (line 41)
+* uc_is_property_pattern_white_space: Properties as functions.
+ (line 40)
+* uc_is_property_private_use: Properties as functions.
+ (line 20)
+* uc_is_property_punctuation: Properties as functions.
+ (line 93)
+* uc_is_property_quotation_mark: Properties as functions.
+ (line 96)
+* uc_is_property_radical: Properties as functions.
+ (line 80)
+* uc_is_property_sentence_terminal: Properties as functions.
+ (line 97)
+* uc_is_property_soft_dotted: Properties as functions.
+ (line 30)
+* uc_is_property_space: Properties as functions.
+ (line 87)
+* uc_is_property_terminal_punctuation: Properties as functions.
+ (line 98)
+* uc_is_property_titlecase: Properties as functions.
+ (line 29)
+* uc_is_property_unassigned_code_value: Properties as functions.
+ (line 21)
+* uc_is_property_unified_ideograph: Properties as functions.
+ (line 79)
+* uc_is_property_uppercase: Properties as functions.
+ (line 25)
+* uc_is_property_variation_selector: Properties as functions.
+ (line 19)
+* uc_is_property_white_space: Properties as functions.
+ (line 9)
+* uc_is_property_xid_continue: Properties as functions.
+ (line 39)
+* uc_is_property_xid_start: Properties as functions.
+ (line 38)
+* uc_is_property_zero_width: Properties as functions.
+ (line 86)
+* uc_is_punct: Classifications like in ISO C.
+ (line 44)
+* uc_is_script: Scripts. (line 31)
+* uc_is_space: Classifications like in ISO C.
+ (line 49)
+* uc_is_upper: Classifications like in ISO C.
+ (line 54)
+* uc_is_xdigit: Classifications like in ISO C.
+ (line 60)
+* uc_java_ident_category: ISO C and Java syntax.
+ (line 43)
+* uc_locale_language: Case mappings of strings.
+ (line 21)
+* uc_mirror_char: Mirrored character. (line 14)
+* uc_numeric_value: Numeric value. (line 23)
+* uc_property_byname: Properties as objects.
+ (line 123)
+* uc_property_is_valid: Properties as objects.
+ (line 133)
+* uc_property_t: Properties as objects.
+ (line 9)
+* uc_script: Scripts. (line 20)
+* uc_script_byname: Scripts. (line 25)
+* uc_script_t: Scripts. (line 11)
+* uc_tolower: Case mappings of characters.
+ (line 20)
+* uc_totitle: Case mappings of characters.
+ (line 23)
+* uc_toupper: Case mappings of characters.
+ (line 17)
+* uc_width: uniwidth.h. (line 23)
+* uc_wordbreak_property: Word break property. (line 32)
+* UCS-4: Unicode. (line 14)
+* ucs4_t: unitypes.h. (line 16)
+* uint16_t: unitypes.h. (line 10)
+* uint32_t: unitypes.h. (line 11)
+* uint8_t: unitypes.h. (line 9)
+* ulc_asnprintf: unistdio.h. (line 53)
+* ulc_asprintf: unistdio.h. (line 50)
+* ulc_casecmp: Case insensitive comparison.
+ (line 57)
+* ulc_casecoll: Case insensitive comparison.
+ (line 101)
+* ulc_casexfrm: Case insensitive comparison.
+ (line 81)
+* ulc_fprintf: unistdio.h. (line 229)
+* ulc_possible_linebreaks: unilbrk.h. (line 50)
+* ulc_snprintf: unistdio.h. (line 48)
+* ulc_sprintf: unistdio.h. (line 45)
+* ulc_vasnprintf: unistdio.h. (line 65)
+* ulc_vasprintf: unistdio.h. (line 62)
+* ulc_vfprintf: unistdio.h. (line 232)
+* ulc_vsnprintf: unistdio.h. (line 59)
+* ulc_vsprintf: unistdio.h. (line 56)
+* ulc_width_linebreaks: unilbrk.h. (line 71)
+* ulc_wordbreaks: Word breaks in a string.
+ (line 12)
+* Unicode: Unicode. (line 6)
+* Unicode character, bidirectional category: Bidirectional category.
+ (line 6)
+* Unicode character, block: Blocks. (line 24)
+* Unicode character, canonical combining class: Canonical combining class.
+ (line 6)
+* Unicode character, case mappings: Case mappings of characters.
+ (line 6)
+* Unicode character, classification: General category. (line 6)
+* Unicode character, classification like in C: Classifications like in ISO C.
+ (line 6)
+* Unicode character, general category: General category. (line 6)
+* Unicode character, mirroring: Mirrored character. (line 6)
+* Unicode character, name: uniname.h. (line 6)
+* Unicode character, properties: Properties. (line 6)
+* Unicode character, script: Scripts. (line 17)
+* Unicode character, validity in C identifiers: ISO C and Java syntax.
+ (line 38)
+* Unicode character, validity in Java identifiers: ISO C and Java syntax.
+ (line 42)
+* Unicode character, value <1>: Numeric value. (line 6)
+* Unicode character, value <2>: Digit value. (line 6)
+* Unicode character, value: Decimal digit value. (line 6)
+* Unicode character, width: uniwidth.h. (line 22)
+* unicode_character_name: uniname.h. (line 19)
+* unicode_name_character: uniname.h. (line 25)
+* uninorm_decomposing_form: Normalization of strings.
+ (line 40)
+* uninorm_filter_create: Normalization of streams.
+ (line 19)
+* uninorm_filter_flush: Normalization of streams.
+ (line 33)
+* uninorm_filter_free: Normalization of streams.
+ (line 43)
+* uninorm_filter_write: Normalization of streams.
+ (line 29)
+* uninorm_is_compat_decomposing: Normalization of strings.
+ (line 32)
+* uninorm_is_composing: Normalization of strings.
+ (line 36)
+* uninorm_t: Normalization of strings.
+ (line 10)
+* uppercasing: Case mappings of strings.
+ (line 6)
+* use cases: Introduction. (line 44)
+* UTF-16: Unicode. (line 14)
+* UTF-16, strings: Unicode strings. (line 6)
+* UTF-32: Unicode. (line 14)
+* UTF-32, strings: Unicode strings. (line 6)
+* UTF-8: Unicode. (line 14)
+* UTF-8, strings: Unicode strings. (line 6)
+* validity: Elementary string checks.
+ (line 6)
+* value, of libunistring: Introduction. (line 44)
+* value, of Unicode character <1>: Numeric value. (line 6)
+* value, of Unicode character <2>: Digit value. (line 6)
+* value, of Unicode character: Decimal digit value. (line 6)
+* verification: Elementary string checks.
+ (line 6)
+* wchar_t, type: The wchar_t mess. (line 6)
+* width: uniwidth.h. (line 6)
+* word breaks: uniwbrk.h. (line 6)
+* wrapping: unilbrk.h. (line 6)
+
+
+
+Tag Table:
+Node: Top270
+Node: Introduction3239
+Node: Unicode5236
+Node: Unicode and i18n7116
+Node: Locale encodings8579
+Node: In-memory representation10787
+Node: char * strings11896
+Node: The wchar_t mess17153
+Node: Unicode strings19357
+Node: Conventions20508
+Node: unitypes.h22708
+Node: unistr.h23280
+Node: Elementary string checks23837
+Node: Elementary string conversions24459
+Node: Elementary string functions25761
+Node: Elementary string functions with memory allocation32732
+Node: Elementary string functions on NUL terminated strings33354
+Node: uniconv.h45090
+Node: unistdio.h52801
+Node: uniname.h61004
+Node: unictype.h62337
+Node: General category63246
+Node: Object oriented API64289
+Node: Bit mask API72751
+Node: Canonical combining class75005
+Node: Bidirectional category78219
+Node: Decimal digit value81276
+Node: Digit value81837
+Node: Numeric value82398
+Node: Mirrored character83289
+Node: Properties83962
+Node: Properties as objects84653
+Node: Properties as functions91031
+Node: Scripts96582
+Node: Blocks97968
+Node: ISO C and Java syntax99291
+Node: Classifications like in ISO C101001
+Node: uniwidth.h103705
+Node: uniwbrk.h105742
+Node: Word breaks in a string106269
+Node: Word break property107320
+Node: unilbrk.h108416
+Node: uninorm.h112587
+Node: Decomposition of characters113219
+Node: Composition of characters116595
+Node: Normalization of strings117304
+Node: Normalizing comparisons119366
+Node: Normalization of streams121722
+Node: unicase.h123810
+Node: Case mappings of characters124495
+Node: Case mappings of strings126542
+Node: Case mappings of substrings129875
+Node: Case insensitive comparison136805
+Node: Case detection142156
+Node: uniregex.h145424
+Node: Using the library145647
+Node: Installation146058
+Node: Compiler options146531
+Node: Include files148090
+Node: Autoconf macro149314
+Node: Reporting problems150872
+Node: More functionality151669
+Node: Licenses152112
+Node: GNU GPL153747
+Node: GNU LGPL191292
+Node: GNU FDL199738
+Node: Index224863
+
+End Tag Table
+
+
+Local Variables:
+coding: utf-8
+End:
diff --git a/doc/libunistring.texi b/doc/libunistring.texi
new file mode 100644
index 00000000..8eb8061f
--- /dev/null
+++ b/doc/libunistring.texi
@@ -0,0 +1,989 @@
+\input texinfo @c -*-texinfo-*-
+@comment %**start of header
+@setfilename libunistring.info
+@documentencoding UTF-8
+@settitle GNU libunistring
+@finalout
+@c Indices:
+@c am = autoconf macro @amindex
+@c cp = concept @cindex
+@c fn = function @findex
+@c tp = type @tindex
+@c Unused predefined indices:
+@c ky = keystroke @kindex
+@c pg = program @pindex
+@c vr = variable @vindex
+@defcodeindex am
+@syncodeindex am cp
+@syncodeindex fn cp
+@syncodeindex tp cp
+@ifclear texi2html
+@firstparagraphindent insert
+@end ifclear
+@c texi2html-1.76 does not support @arrow{}.
+@ifset texi2html
+@macro arrow{}
+→
+@end macro
+@end ifset
+@comment %**end of header
+
+@include version.texi
+
+@c Location of the POSIX specification on the web.
+@set POSIXURL http://www.opengroup.org/onlinepubs/9699919799
+
+@c Macro for referencing a POSIX function.
+@c We don't write it as func(), see section "GNU Manuals" of the
+@c GNU coding standards.
+@ifinfo
+@macro posixfunc{func}
+@code{\func\}
+@end macro
+@end ifinfo
+@ifnotinfo
+@macro posixfunc{func}
+@uref{@value{POSIXURL}/functions/\func\.html,,@code{\func\}}
+@end macro
+@end ifnotinfo
+
+@c Macro for referencing a normal function.
+@c We don't write it as func(), see section "GNU Manuals" of the
+@c GNU coding standards.
+@macro func{func}
+@code{\func\}
+@end macro
+
+@c Macro for an advisory ragged line break in TeX mode.
+@c Needed because there are long unbreakable pieces of text (such as URLs or
+@c formulas), TeX is too shy to move them to a new line. TeX considers only
+@c two choices: a line break in aligned mode (which it rejects due to aesthetic
+@c reasons) and writing into the margin. What we want in many cases is a line
+@c break without filling the first line. Like what @* delivers. But we want it
+@c only when needed, so that it disappears when unrelated changes in the same
+@c paragraph cause a line break in a nearby position. And we need it only in
+@c TeX mode. info and HTML modes are fine.
+@c This trick is from Karl Berry.
+@iftex
+@macro texnl
+@hfil@penalty9000@hfilneg
+@end macro
+@end iftex
+@ifnottex
+@macro texnl
+@end macro
+@end ifnottex
+
+@ifinfo
+@dircategory Software development
+@direntry
+* GNU libunistring: (libunistring). Unicode string library.
+@end direntry
+@end ifinfo
+
+@ifinfo
+This manual is for GNU libunistring.
+
+@ignore
+@c This was: @copying but it triggers a makeinfo 4.13 bug
+Copyright (C) 2001-2009 Free Software Foundation, Inc.
+
+This manual is free documentation. It is dually licensed under the
+GNU FDL and the GNU GPL. This means that you can redistribute this
+manual under either of these two licenses, at your choice.
+
+This manual is covered by the GNU FDL. Permission is granted to copy,
+distribute and/or modify this document under the terms of the
+GNU Free Documentation License (FDL), either version 1.2 of the
+License, or (at your option) any later version published by the
+Free Software Foundation (FSF); with no Invariant Sections, with no
+Front-Cover Text, and with no Back-Cover Texts.
+A copy of the license is included in @ref{GNU FDL}.
+
+This manual is covered by the GNU GPL. You can redistribute it and/or
+modify it under the terms of the GNU General Public License (GPL), either
+version 3 of the License, or (at your option) any later version published
+by the Free Software Foundation (FSF).
+A copy of the license is included in @ref{GNU GPL}.
+@end ignore
+@end ifinfo
+
+@titlepage
+@title GNU libunistring, version @value{VERSION}
+@subtitle updated @value{UPDATED}
+@subtitle Edition @value{EDITION}, @value{UPDATED}
+@author Bruno Haible
+
+@ifnothtml
+@page
+@vskip 0pt plus 1filll
+@c @insertcopying
+Copyright (C) 2001-2009 Free Software Foundation, Inc.
+
+This manual is free documentation. It is dually licensed under the
+GNU FDL and the GNU GPL. This means that you can redistribute this
+manual under either of these two licenses, at your choice.
+
+This manual is covered by the GNU FDL. Permission is granted to copy,
+distribute and/or modify this document under the terms of the
+GNU Free Documentation License (FDL), either version 1.2 of the
+License, or (at your option) any later version published by the
+Free Software Foundation (FSF); with no Invariant Sections, with no
+Front-Cover Text, and with no Back-Cover Texts.
+A copy of the license is included in @ref{GNU FDL}.
+
+This manual is covered by the GNU GPL. You can redistribute it and/or
+modify it under the terms of the GNU General Public License (GPL), either
+version 3 of the License, or (at your option) any later version published
+by the Free Software Foundation (FSF).
+A copy of the license is included in @ref{GNU GPL}.
+@end ifnothtml
+@end titlepage
+
+@c Table of Contents
+@contents
+
+@ifnottex
+@node Top
+@top GNU libunistring
+@end ifnottex
+
+@menu
+* Introduction:: Who may need Unicode strings?
+* Conventions:: Conventions used in this manual
+* unitypes.h:: Elementary types
+* unistr.h:: Elementary Unicode string functions
+* uniconv.h:: Conversions between Unicode and encodings
+* unistdio.h:: Output with Unicode strings
+* uniname.h:: Names of Unicode characters
+* unictype.h:: Unicode character classification and properties
+* uniwidth.h:: Display width
+* uniwbrk.h:: Word breaks in strings
+* unilbrk.h:: Line breaking
+* uninorm.h:: Normalization forms
+* unicase.h:: Case mappings
+* uniregex.h:: Regular expressions
+* Using the library:: How to link with the library and use it?
+* More functionality:: More advanced functionality
+* Licenses:: Licenses
+
+* Index:: General Index
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+Introduction
+
+* Unicode:: What is Unicode?
+* Unicode and i18n:: Unicode and internationalization
+* Locale encodings:: What is a locale encoding?
+* In-memory representation:: How to represent strings in memory?
+* char * strings:: What to keep in mind with @code{char *} strings
+* The wchar_t mess:: Why @code{wchar_t *} strings are useless
+* Unicode strings:: How are Unicode strings represented?
+
+unistr.h
+
+* Elementary string checks::
+* Elementary string conversions::
+* Elementary string functions::
+* Elementary string functions with memory allocation::
+* Elementary string functions on NUL terminated strings::
+
+unictype.h
+
+* General category::
+* Canonical combining class::
+* Bidirectional category::
+* Decimal digit value::
+* Digit value::
+* Numeric value::
+* Mirrored character::
+* Properties::
+* Scripts::
+* Blocks::
+* ISO C and Java syntax::
+* Classifications like in ISO C::
+
+General category
+
+* Object oriented API::
+* Bit mask API::
+
+Properties
+
+* Properties as objects::
+* Properties as functions::
+
+uniwbrk.h
+
+* Word breaks in a string::
+* Word break property::
+
+uninorm.h
+
+* Decomposition of characters::
+* Composition of characters::
+* Normalization of strings::
+* Normalizing comparisons::
+* Normalization of streams::
+
+unicase,h
+
+* Case mappings of characters::
+* Case mappings of strings::
+* Case mappings of substrings::
+* Case insensitive comparison::
+* Case detection::
+
+Using the library
+
+* Installation::
+* Compiler options::
+* Include files::
+* Autoconf macro::
+* Reporting problems::
+
+Licenses
+
+* GNU GPL:: GNU General Public License
+* GNU LGPL:: GNU Lesser General Public License
+* GNU FDL:: GNU Free Documentation License
+
+@end detailmenu
+@end menu
+
+@node Introduction
+@chapter Introduction
+
+This library provides functions for manipulating Unicode strings and
+for manipulating C strings according to the Unicode standard.
+
+It consists of the following parts:
+
+@table @code
+@item <unistr.h>
+elementary string functions
+@item <uniconv.h>
+conversion from/to legacy encodings
+@item <unistdio.h>
+formatted output to strings
+@item <uniname.h>
+character names
+@item <unictype.h>
+character classification and properties
+@item <uniwidth.h>
+string width when using nonproportional fonts
+@item <uniwbrk.h>
+word breaks
+@item <unilbrk.h>
+line breaking algorithm
+@item <uninorm.h>
+normalization (composition and decomposition)
+@item <unicase.h>
+case folding
+@item <uniregex.h>
+regular expressions (not yet implemented)
+@end table
+
+@cindex use cases
+@cindex value, of libunistring
+libunistring is for you if your application involves non-trivial text
+processing, such as upper/lower case conversions, line breaking, operations
+on words, or more advanced analysis of text. Text provided by the user can,
+in general, contain characters of all kinds of scripts. The text processing
+functions provided by this library handle all scripts and all languages.
+
+libunistring is for you if your application already uses the ISO C / POSIX
+@code{<ctype.h>}, @code{<wctype.h>} functions and the text it operates on is
+provided by the user and can be in any language.
+
+libunistring is also for you if your application uses Unicode strings as
+internal in-memory representation.
+
+@menu
+* Unicode:: What is Unicode?
+* Unicode and i18n:: Unicode and internationalization
+* Locale encodings:: What is a locale encoding?
+* In-memory representation:: How to represent strings in memory?
+* char * strings:: What to keep in mind with @code{char *} strings
+* The wchar_t mess:: Why @code{wchar_t *} strings are useless
+* Unicode strings:: How are Unicode strings represented?
+@end menu
+
+@node Unicode
+@section Unicode
+
+@cindex Unicode
+Unicode is a standardized repertoire of characters that contains characters
+from all scripts of the world, from Latin letters to Chinese ideographs
+and Babylonian cuneiform glyphs. It also specifies how these characters
+are to be rendered on a screen or on paper, and how common text processing
+(word selection, line breaking, uppercasing of page titles etc.) is supposed
+to behave on Unicode text.
+
+Unicode also specifies three ways of storing sequences of Unicode
+characters in a computer whose basic unit of data is an 8-bit byte:
+@cindex UTF-8
+@cindex UTF-16
+@cindex UTF-32
+@cindex UCS-4
+@table @asis
+@item UTF-8
+Every character is represented as 1 to 4 bytes.
+@item UTF-16
+Every character is represented as 1 to 2 units of 16 bits.
+@item UTF-32, a.k.a@. UCS-4
+Every character is represented as 1 unit of 32 bits.
+@end table
+
+For encoding Unicode text in a file, UTF-8 is usually used. For encoding
+Unicode strings in memory for a program, either of the three encoding forms
+can be reasonably used.
+
+Unicode is widely used on the web. Prior to the use of Unicode, web pages
+were in many different encodings (ISO-8859-1 for English, French, Spanish,
+ISO-8859-2 for Polish, ISO-8859-7 for Greek, KOI8-R for Russian, GB2312 or
+BIG5 for Chinese, ISO-2022-JP-2 or EUC-JP or Shift_JIS for Japanese, and many
+many others). It was next to impossible to create a document that contained
+Chinese and Polish text in the same document. Due to the many encodings for
+Japanese, even the processing of pure Japanese text was error prone.
+
+References:
+@itemize @bullet
+@item
+The Unicode standard:@texnl{} @url{http://www.unicode.org/}
+@item
+Definition of UTF-8:@texnl{} @url{http://www.rfc-editor.org/rfc/rfc3629.txt}
+@item
+Definition of UTF-16:@texnl{} @url{http://www.rfc-editor.org/rfc/rfc2781.txt}
+@item
+Markus Kuhn's UTF-8 and Unicode FAQ:@texnl{}
+@url{http://www.cl.cam.ac.uk/~mgk25/unicode.html}
+@end itemize
+
+@node Unicode and i18n
+@section Unicode and Internationalization
+
+@cindex internationalization
+Internationalization is the process of changing the source code of a program
+so that it can meet the expectations of users in any culture, if culture
+specific data (translations, images etc.) are provided.
+
+Use of Unicode is not strictly required for internationalization, but it
+makes internationalization much easier, because operations that need to
+look at specific characters (like hyphenation, spell checking, or the
+automatic conversion of double-quotes to opening and closing double-quote
+characters) don't need to consider multiple possible encodings of the text.
+
+Use of Unicode also enables multilingualization: the ability of having text
+in multiple languages present in the same document or even in the same line
+of text.
+
+But use of Unicode is not everything. Internationalization usually consists
+of three features:
+@itemize @bullet
+@item
+Use of Unicode where needed for text processing. This is what this library
+is for.
+@item
+Use of message catalogs for messages shown to the user, This is what
+GNU gettext is about.
+@item
+Use of locale specific conventions for date and time formats, for numeric
+formatting, or for sorting of text. This can be done adequately with the
+POSIX APIs and the implementation of locales in the GNU C library.
+@end itemize
+
+@node Locale encodings
+@section Locale encodings
+
+@cindex locale
+A locale is a set of cultural conventions. According to POSIX, for a program,
+at any moment, there is one locale being designated as the ``current locale''.
+(Actually, POSIX supports also one locale per thread, but this feature is not
+yet universally implemented and not widely used.)
+@cindex locale categories
+The locale is partitioned into several aspects, called the ``categories''
+of the locale. The main various aspects are:
+@itemize
+@item
+The character encoding and the character properties. This is the
+@code{LC_CTYPE} category.
+@item
+The sorting rules for text. This is the @code{LC_COLLATE} category.
+@item
+The language specific translations of messages. This is the
+@code{LC_MESSAGES} category.
+@item
+The formatting rules for numbers, such as the decimal separator. This is
+the @code{LC_NUMERIC} category.
+@item
+The formatting rules for amounts of money. This is the @code{LC_MONETARY}
+category.
+@item
+The formatting of date and time. This is the @code{LC_TIME} category.
+@end itemize
+
+@cindex locale encoding
+In particular, the @code{LC_CTYPE} category of the current locale determines
+the character encoding. This is the encoding of @samp{char *} strings.
+We also call it the ``locale encoding''. GNU libunistring has a function,
+@func{locale_charset}, that returns a standardized (platform independent)
+name for this encoding.
+
+All locale encodings used on glibc systems are essentially ASCII compatible:
+Most graphic ASCII characters have the same representation, as a single byte,
+in that encoding as in ASCII.
+
+Among the possible locale encodings are UTF-8 and GB18030. Both allow
+to represent any Unicode character as a sequence of bytes. UTF-8 is used in
+most of the world, whereas GB18030 is used in the People's Republic of China,
+because it is backward compatible with the GB2312 encoding that was used in
+this country earlier.
+
+The legacy locale encodings, ISO-8859-15 (which supplanted ISO-8859-1 in
+most of Europe), ISO-8859-2, KOI8-R, EUC-JP, etc., are still in use in
+many places, though.
+
+UTF-16 and UTF-32 are not used as locale encodings, because they are not
+ASCII compatible.
+
+@node In-memory representation
+@section Choice of in-memory representation of strings
+
+There are three ways of representing strings in memory of a running
+program.
+@itemize
+@item
+As @samp{char *} strings. Such strings are represented in locale encoding.
+This approach is employed when not much text processing is done by the
+program. When some Unicode aware processing is to be done, a string is
+converted to Unicode on the fly and back to locale encoding afterwards.
+@item
+As UTF-8 or UTF-16 or UTF-32 strings. This implies that conversion from
+locale encoding to Unicode is performed on input, and in the opposite
+direction on output. This approach is employed when the program does
+a significant amount of text processing, or when the program has multiple
+threads operating on the same data but in different locales.
+@item
+As @samp{wchar_t *}, a.k.a@. ``wide strings''. This approach is misguided,
+see @ref{The wchar_t mess}.
+@end itemize
+
+@node char * strings
+@section @samp{char *} strings
+
+@cindex C string functions
+The classical C strings, with its C library support standardized by
+ISO C and POSIX, can be used in internationalized programs with some
+precautions. The problem with this API is that many of the C library
+functions for strings don't work correctly on strings in locale
+encodings, leading to bugs that only people in some cultures of the
+world will experience.
+
+@cindex locale, multibyte
+The first problem with the C library API is the support of multibyte
+locales. According to the locale encoding, in general, every character
+is represented by one or more bytes (up to 4 bytes in practice --- but
+use @code{MB_LEN_MAX} instead of the number 4 in the code).
+When every character is represented by only 1 byte, we speak of an
+``unibyte locale'', otherwise of a ``multibyte locale''. It is important
+to realize that the majority of Unix installations nowadays use UTF-8
+or GB18030 as locale encoding; therefore, the majority of users are
+using multibyte locales.
+
+@cindex char, type
+The important fact to remember is:
+@cartouche
+@emph{A @samp{char} is a byte, not a character.}
+@end cartouche
+
+As a consequence:
+@itemize
+@item
+The @code{<ctype.h>} API is useless in this context; it does not work in
+multibyte locales.
+@item
+The @posixfunc{strlen} function does not return the number of characters
+in a string. Nor does it return the number of screen columns occupied
+by a string after it is output. It merely returns the number of
+@emph{bytes} occupied by a string.
+@item
+Truncating a string, for example, with @posixfunc{strncpy}, can have the
+effect of truncating it in the middle of a multibyte character. Such
+a string will, when output, have a garbled character at its end, often
+represented by a hollow box.
+@item
+@posixfunc{strchr} and @posixfunc{strrchr} do not work with multibyte strings
+if the locale encoding is GB18030 and the character to be searched is
+a digit.
+@item
+@posixfunc{strstr} does not work with multibyte strings if the locale encoding
+is different from UTF-8.
+@item
+@posixfunc{strcspn}, @posixfunc{strpbrk}, @posixfunc{strspn} cannot work
+correctly in multibyte locales: they assume the second argument is a list of
+single-byte characters. Even in this simple case, they do not work with
+multibyte strings if the locale encoding is GB18030 and one of the
+characters to be searched is a digit.
+@item
+@posixfunc{strsep} and @posixfunc{strtok_r} do not work with multibyte strings
+unless all of the delimiter characters are ASCII characters < 0x30.
+@item
+The @posixfunc{strcasecmp}, @posixfunc{strncasecmp}, and @posixfunc{strcasestr}
+functions do not work with multibyte strings.
+@end itemize
+
+The workarounds can be found in GNU gnulib
+@url{http://www.gnu.org/software/gnulib/}.
+@itemize
+@item
+gnulib has modules @samp{mbchar}, @samp{mbiter}, @samp{mbuiter} that
+represent multibyte characters and allow to iterate across a multibyte
+string with the same ease as through a unibyte string.
+@item
+gnulib has functions @func{mbslen} and @func{mbswidth} that can be
+used instead of @posixfunc{strlen} when the number of characters or the
+number of screen columns of a string is requested.
+@item
+gnulib has functions @func{mbschr} and @func{mbsrrchr} that are
+like @posixfunc{strchr} and @posixfunc{strrchr}, but work in multibyte locales.
+@item
+gnulib has a function @func{mbsstr}, like @posixfunc{strstr}, but works
+in multibyte locales.
+@item
+gnulib has functions @func{mbscspn}, @func{mbspbrk}, @func{mbsspn}
+that are like @posixfunc{strcspn}, @posixfunc{strpbrk}, @posixfunc{strspn}, but
+work in multibyte locales.
+@item
+gnulib has functions @func{mbssep} and @func{mbstok_r} that are
+like @posixfunc{strsep} and @posixfunc{strtok_r} but work in multibyte locales.
+@item
+gnulib has functions @func{mbscasecmp}, @func{mbsncasecmp},
+@func{mbspcasecmp}, and @func{mbscasestr} that are like @posixfunc{strcasecmp},
+@posixfunc{strncasecmp}, and @posixfunc{strcasestr}, but
+work in multibyte locales. Still, the function @code{ulc_casecmp} is
+preferable to these functions; see below.
+@end itemize
+
+The second problem with the C library API is that it has some assumptions built-in that are not valid in some languages:
+@itemize
+@item
+It assumes that there are only two forms of every character: uppercase
+and lowercase. This is not true for Croatian, where the character
+@sc{LETTER DZ WITH CARON} comes in three forms:
+@sc{LATIN CAPITAL LETTER DZ WITH CARON} (DZ),
+@sc{LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON} (Dz),
+@sc{LATIN SMALL LETTER DZ WITH CARON} (dz).
+@item
+It assumes that uppercasing of 1 character leads to 1 character. This
+is not true for German, where the @sc{LATIN SMALL LETTER SHARP S}, when
+uppercased, becomes @samp{SS}.
+@item
+It assumes that there is 1:1 mapping between uppercase and lowercase forms.
+This is not true for the Greek sigma: @sc{GREEK CAPITAL LETTER SIGMA} is
+the uppercase of both @sc{GREEK SMALL LETTER SIGMA} and
+@sc{GREEK SMALL LETTER FINAL SIGMA}.
+@item
+It assumes that the upper/lowercase mappings are position independent.
+This is not true for the Greek sigma and the Lithuanian i.
+@end itemize
+
+The correct way to deal with this problem is
+@enumerate
+@item
+to provide functions for titlecasing, as well as for upper- and
+lowercasing,
+@item
+to view case transformations as functions that operates on strings,
+rather than on characters.
+@end enumerate
+
+This is implemented in this library, through the functions declared in @code{<unicase.h>}, see @ref{unicase.h}.
+
+@node The wchar_t mess
+@section The @code{wchar_t} mess
+
+@cindex wchar_t, type
+The ISO C and POSIX standard creators made an attempt to fix the first
+problem mentioned in the previous section. They introduced
+@itemize
+@item
+a type @samp{wchar_t}, designed to encapsulate an entire character,
+@item
+a ``wide string'' type @samp{wchar_t *}, and
+@item
+functions declared in @code{<wctype.h>} that were meant to supplant the
+ones in @code{<ctype.h>}.
+@end itemize
+
+Unfortunately, this API and its implementation has numerous problems:
+
+@itemize
+@item
+On AIX and Windows platforms, @code{wchar_t} is a 16-bit type. This
+means that it can never accommodate an entire Unicode character. Either
+the @code{wchar_t *} strings are limited to characters in UCS-2 (the
+``Basic Multilingual Plane'' of Unicode), or --- if @code{wchar_t *}
+strings are encoded in UTF-16 --- a @code{wchar_t} represents only half
+of a character in the worst case, making the @code{<wctype.h>} functions
+pointless.
+
+@item
+On Solaris and FreeBSD, the @code{wchar_t} encoding is locale dependent
+and undocumented. This means, if you want to know any property of a
+@code{wchar_t} character, other than the properties defined by
+@code{<wctype.h>} --- such as whether it's a dash, currency symbol,
+paragraph separator, or similar ---, you have to convert it to
+@code{char *} encoding first, by use of the function @posixfunc{wctomb}.
+
+@item
+When you read a stream of wide characters, through the functions
+@posixfunc{fgetwc} and @posixfunc{fgetws}, and when the input stream/file is
+not in the expected encoding, you have no way to determine the invalid
+byte sequence and do some corrective action. If you use these
+functions, your program becomes ``garbage in - more garbage out'' or
+``garbage in - abort''.
+@end itemize
+
+As a consequence, it is better to use multibyte strings, as explained in
+the previous section. Such multibyte strings can bypass limitations
+of the @code{wchar_t} type, if you use functions defined in gnulib and
+libunistring for text processing. They can also faithfully transport
+malformed characters that were present in the input, without requiring
+the program to produce garbage or abort.
+
+@node Unicode strings
+@section Unicode strings
+
+libunistring supports Unicode strings in three representations:
+@cindex UTF-8, strings
+@cindex UTF-16, strings
+@cindex UTF-32, strings
+@itemize
+@item
+UTF-8 strings, through the type @samp{uint8_t *}. The units are bytes
+(@code{uint8_t}).
+@item
+UTF-16 strings, through the type @samp{uint16_t *}, The units are 16-bit
+memory words (@code{uint16_t}).
+@item
+UTF-32 strings, through the type @samp{uint32_t *}. The units are 32-bit
+memory words (@code{uint32_t}).
+@end itemize
+
+As with C strings, there are two variants:
+@itemize
+@item
+Unicode strings with a terminating NUL character are represented as
+a pointer to the first unit of the string. There is a unit containing
+a 0 value at the end. It is considered part of the string for all
+memory allocation purposes, but is not considered part of the string
+for all other logical purposes.
+@item
+Unicode strings where embedded NUL characters are allowed. These
+are represented by a pointer to the first unit and the number of units
+(not bytes!) of the string. In this setting, there is no trailing
+zero-valued unit used as ``end marker''.
+@end itemize
+
+@node Conventions
+@chapter Conventions
+
+This chapter explains conventions valid throughout the libunistring library.
+
+@cindex argument conventions
+Variables of type @code{char *} denote C strings in locale encoding.
+See @ref{Locale encodings}.
+
+Variables of type @code{uint8_t *} denote UTF-8 strings. Their units
+are bytes.
+
+Variables of type @code{uint16_t *} denote UTF-16 strings, without byte
+order mark. Their units are 2-byte words.
+
+Variables of type @code{uint32_t *} denote UTF-32 strings, without byte
+order mark. Their units are 4-byte words.
+
+Argument pairs @code{(@var{s}, @var{n})} denote a string
+@code{@var{s}[0..@var{n}-1]} with exactly @var{n} units.
+
+All functions with prefix @samp{ulc_} operate on C strings in locale
+encoding.
+
+All functions with prefix @samp{u8_} operate on UTF-8 strings.
+
+All functions with prefix @samp{u16_} operate on UTF-16 strings.
+
+All functions with prefix @samp{u32_} operate on UTF-32 strings.
+
+For every function with prefix @samp{u8_}, operating on UTF-8 strings,
+there is also a corresponding function with prefix @samp{u16_},
+operating on UTF-16 strings, and a corresponding function with prefix
+@samp{u32_}, operating on UTF-32 strings. Their description is
+analogous; in this documentation we describe only the function that
+operates on UTF-8 strings, for brevity.
+
+A declaration with a variable @var{n} denotes the three concrete
+declarations with @var{n} = 8, @var{n} = 16, @var{n} = 32.
+
+All parameters starting with @samp{str} and the parameters of
+functions starting with @code{u8_str}/@code{u16_str}/@code{u32_str}
+denote a NUL terminated string.
+
+@cindex return value conventions
+Error values are always returned through the @code{errno} variable,
+usually with a return value that indicates the presence of an error
+(NULL for functions that return an pointer, or -1 for functions that
+return an @code{int}).
+
+Functions returning a string result take a
+@code{(@var{resultbuf}, @var{lengthp})}
+argument pair. If @var{resultbuf} is not NULL and the result fits
+into @code{*@var{lengthp}} units, it is put in @var{resultbuf}, and
+@var{resultbuf} is returned. Otherwise, a freshly allocated string
+is returned. In both cases, @code{*@var{lengthp}} is set to the
+length (number of units) of the returned string. In case of error,
+NULL is returned and @code{errno} is set.
+
+@include unitypes.texi
+@include unistr.texi
+@include uniconv.texi
+@include unistdio.texi
+@include uniname.texi
+@include unictype.texi
+@include uniwidth.texi
+@include uniwbrk.texi
+@include unilbrk.texi
+@include uninorm.texi
+@include unicase.texi
+@include uniregex.texi
+
+@node Using the library
+@chapter Using the library
+
+This chapter explains some practical considerations, regarding the
+installation and compiler options that are needed in order to use this
+library.
+
+@menu
+* Installation::
+* Compiler options::
+* Include files::
+* Autoconf macro::
+* Reporting problems::
+@end menu
+
+@node Installation
+@section Installation
+
+@cindex dependencies
+Before you can use the library, it must be installed. First, you have to
+make sure all dependencies are installed. They are listed in the file
+@file{DEPENDENCIES}.
+
+@cindex installation
+Then you can proceed to build and install the library, as described in the
+file @file{INSTALL}. For installation on Windows systems, please refer to
+the file @file{README.woe32}.
+
+@node Compiler options
+@section Compiler options
+
+Let's denote as @code{LIBUNISTRING_PREFIX} the value of the @samp{--prefix}
+option that you passed to @code{configure} while installing this package.
+If you didn't pass any @samp{--prefix} option, then the package is installed
+in @file{/usr/local}.
+
+Let's denote as @code{LIBUNISTRING_INCLUDEDIR} the directory where the
+include files were installed. This is usually the same as
+@code{$@{LIBUNISTRING_PREFIX@}/include}. Except that if you passed an
+@samp{--includedir} option to @code{configure}, it is the value of that
+option.
+
+Let's further denote as @code{LIBUNISTRING_LIBDIR} the directory where
+the library itself was installed. This is the value that you passed
+with the @samp{--libdir} option to @code{configure}, or otherwise the
+same as @code{$@{LIBUNISTRING_PREFIX@}/lib}. Recall that when building
+in 64-bit mode on a 64-bit GNU/Linux system that supports executables
+in either 64-bit mode or 32-bit mode, you should have used the option
+@code{--libdir=$@{LIBUNISTRING_PREFIX@}/lib64}.
+
+@cindex compiler options
+So that the compiler finds the include files, you have to pass it the
+option @code{-I$@{LIBUNISTRING_INCLUDEDIR@}}.
+
+So that the compiler finds the library during its linking pass, you have
+to pass it the options @code{-L$@{LIBUNISTRING_LIBDIR@} -lunistring}.
+On some systems, in some configurations, you also have to pass options
+needed for linking with @code{libiconv}. The autoconf macro
+@code{gl_LIBUNISTRING} (see @ref{Autoconf macro}) deals with this
+particularity.
+
+@node Include files
+@section Include files
+
+Most of the include files have been presented in the introduction, see
+@ref{Introduction}, and subsequent detailed chapters.
+
+Another include file is @code{<unistring/version.h>}. It contains the
+version number of the libunistring library.
+
+@deftypevr Macro int _LIBUNISTRING_VERSION
+This constant contains the version of libunistring that is being used
+at compile time. It encodes the major and minor parts of the version
+number only. These parts are encoded in the form @code{(major<<8) + minor}.
+@end deftypevr
+
+@deftypevr Constant int _libunistring_version
+This constant contains the version of libunistring that is being used
+at run time. It encodes the major and minor parts of the version
+number only. These parts are encoded in the form @code{(major<<8) + minor}.
+@end deftypevr
+
+It is possible that @code{_libunistring_version} is greater than
+@code{_LIBUNISTRING_VERSION}. This can happen when you use
+@code{libunistring} as a shared library, and a newer, binary
+backward-compatible version has been installed after your program
+that uses @code{libunistring} was installed.
+
+@node Autoconf macro
+@section Autoconf macro
+
+@cindex autoconf macro
+GNU Gnulib provides an autoconf macro that tests for the availability
+of @code{libunistring}. It is contained in the Gnulib module
+@samp{libunistring}, see@texnl{}
+@url{http://www.gnu.org/software/gnulib/MODULES.html#module=libunistring}.
+
+@amindex gl_LIBUNISTRING
+The macro is called @code{gl_LIBUNISTRING}. It searches for an installed
+libunistring. If found, it sets and AC_SUBSTs @code{HAVE_LIBUNISTRING=yes}
+and the @code{LIBUNISTRING} and @code{LTLIBUNISTRING} variables and augments
+the @code{CPPFLAGS} variable, and defines the C macro
+@code{HAVE_LIBUNISTRING} to 1. Otherwise, it sets and AC_SUBSTs
+@code{HAVE_LIBUNISTRING=no} and @code{LIBUNISTRING} and @code{LTLIBUNISTRING}
+to empty.
+
+The complexities that @code{gl_LIBUNISTRING} deals with are the following:
+
+@itemize @bullet
+@item
+On some operating systems, in some configurations, libunistring depends
+on @code{libiconv}, and the options for linking with libiconv must be
+mentioned explicitly on the link command line.
+
+@item
+GNU @code{libunistring}, if installed, is not necessarily already in the
+search path (@code{CPPFLAGS} for the include file search path,
+@code{LDFLAGS} for the library search path).
+
+@item
+GNU @code{libunistring}, if installed, is not necessarily already in the
+run time library search path. To avoid the need for setting an environment
+variable like @code{LD_LIBRARY_PATH}, the macro adds the appropriate
+run time search path options to the @code{LIBUNISTRING} variable. This works
+on most systems.
+@end itemize
+
+@node Reporting problems
+@section Reporting problems
+
+@cindex bug reports
+@cindex bug tracker
+@cindex mailing list
+If you encounter any problem, please don't hesitate to send a detailed
+bug report to the @code{bug-libunistring@@gnu.org} mailing list. You can
+alternatively also use the bug tracker at the project page
+@url{https://savannah.gnu.org/projects/libunistring}.
+
+Please always include the version number of this library, and a short
+description of your operating system and compilation environment with
+corresponding version numbers.
+
+For problems that appear while building and installing @code{libunistring},
+for which you don't find the remedy in the @file{INSTALL} file, please include
+a description of the options that you passed to the @samp{configure} script.
+
+@node More functionality
+@chapter More advanced functionality
+
+@cindex bidirectional reordering
+For bidirectional reordering of strings, we recommend the GNU FriBidi library:
+@url{http://www.fribidi.org/}.
+
+@cindex rendering
+For the rendering of Unicode strings outside of the context of a given toolkit
+(KDE/Qt or GNOME/Gtk), we recommend the Pango library:
+@url{http://www.pango.org/}.
+
+@node Licenses
+@appendix Licenses
+@cindex Licenses
+
+The files of this package are covered by the licenses indicated in each
+particular file or directory. Here is a summary:
+
+@itemize @bullet
+@item
+The @code{libunistring} library is covered by the
+GNU Lesser General Public License (LGPL).
+A copy of the license is included in @ref{GNU LGPL}.
+
+@item
+This manual is free documentation. It is dually licensed under the
+GNU FDL and the GNU GPL. This means that you can redistribute this
+manual under either of these two licenses, at your choice.
+@*
+This manual is covered by the GNU FDL. Permission is granted to copy,
+distribute and/or modify this document under the terms of the
+GNU Free Documentation License (FDL), either version 1.2 of the
+License, or (at your option) any later version published by the
+Free Software Foundation (FSF); with no Invariant Sections, with no
+Front-Cover Text, and with no Back-Cover Texts.
+A copy of the license is included in @ref{GNU FDL}.
+@*
+This manual is covered by the GNU GPL. You can redistribute it and/or
+modify it under the terms of the GNU General Public License (GPL), either
+version 3 of the License, or (at your option) any later version published
+by the Free Software Foundation (FSF).
+A copy of the license is included in @ref{GNU GPL}.
+@end itemize
+
+@menu
+* GNU GPL:: GNU General Public License
+* GNU LGPL:: GNU Lesser General Public License
+* GNU FDL:: GNU Free Documentation License
+@end menu
+
+@page
+@node GNU GPL
+@appendixsec GNU GENERAL PUBLIC LICENSE
+@cindex GPL, GNU General Public License
+@cindex License, GNU GPL
+@include gpl.texi
+@page
+@node GNU LGPL
+@appendixsec GNU LESSER GENERAL PUBLIC LICENSE
+@cindex LGPL, GNU Lesser General Public License
+@cindex License, GNU LGPL
+@include lgpl.texi
+@page
+@node GNU FDL
+@appendixsec GNU Free Documentation License
+@cindex FDL, GNU Free Documentation License
+@cindex License, GNU FDL
+@include fdl.texi
+
+@node Index
+@unnumbered Index
+
+@printindex cp
+
+@bye
+
+@c Local Variables:
+@c indent-tabs-mode: nil
+@c whitespace-check-buffer-indent: nil
+@c End:
diff --git a/doc/libunistring_1.html b/doc/libunistring_1.html
new file mode 100644
index 00000000..646fdc65
--- /dev/null
+++ b/doc/libunistring_1.html
@@ -0,0 +1,531 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: 1. Introduction</title>
+
+<meta name="description" content="GNU libunistring: 1. Introduction">
+<meta name="keywords" content="GNU libunistring: 1. Introduction">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[ &lt;&lt; ]</td>
+<td valign="middle" align="left">[<a href="libunistring_2.html#SEC9" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="Introduction"></a>
+<a name="SEC1"></a>
+<h1 class="chapter"> <a href="libunistring.html#TOC1">1. Introduction</a> </h1>
+
+<p>This library provides functions for manipulating Unicode strings and
+for manipulating C strings according to the Unicode standard.
+</p>
+<p>It consists of the following parts:
+</p>
+<dl compact="compact">
+<dt> <code>&lt;unistr.h&gt;</code></dt>
+<dd><p>elementary string functions
+</p></dd>
+<dt> <code>&lt;uniconv.h&gt;</code></dt>
+<dd><p>conversion from/to legacy encodings
+</p></dd>
+<dt> <code>&lt;unistdio.h&gt;</code></dt>
+<dd><p>formatted output to strings
+</p></dd>
+<dt> <code>&lt;uniname.h&gt;</code></dt>
+<dd><p>character names
+</p></dd>
+<dt> <code>&lt;unictype.h&gt;</code></dt>
+<dd><p>character classification and properties
+</p></dd>
+<dt> <code>&lt;uniwidth.h&gt;</code></dt>
+<dd><p>string width when using nonproportional fonts
+</p></dd>
+<dt> <code>&lt;uniwbrk.h&gt;</code></dt>
+<dd><p>word breaks
+</p></dd>
+<dt> <code>&lt;unilbrk.h&gt;</code></dt>
+<dd><p>line breaking algorithm
+</p></dd>
+<dt> <code>&lt;uninorm.h&gt;</code></dt>
+<dd><p>normalization (composition and decomposition)
+</p></dd>
+<dt> <code>&lt;unicase.h&gt;</code></dt>
+<dd><p>case folding
+</p></dd>
+<dt> <code>&lt;uniregex.h&gt;</code></dt>
+<dd><p>regular expressions (not yet implemented)
+</p></dd>
+</dl>
+
+<a name="IDX1"></a>
+<a name="IDX2"></a>
+<p>libunistring is for you if your application involves non-trivial text
+processing, such as upper/lower case conversions, line breaking, operations
+on words, or more advanced analysis of text. Text provided by the user can,
+in general, contain characters of all kinds of scripts. The text processing
+functions provided by this library handle all scripts and all languages.
+</p>
+<p>libunistring is for you if your application already uses the ISO C / POSIX
+<code>&lt;ctype.h&gt;</code>, <code>&lt;wctype.h&gt;</code> functions and the text it operates on is
+provided by the user and can be in any language.
+</p>
+<p>libunistring is also for you if your application uses Unicode strings as
+internal in-memory representation.
+</p>
+
+<hr size="6">
+<a name="Unicode"></a>
+<a name="SEC2"></a>
+<h2 class="section"> <a href="libunistring.html#TOC2">1.1 Unicode</a> </h2>
+
+<p>Unicode is a standardized repertoire of characters that contains characters
+from all scripts of the world, from Latin letters to Chinese ideographs
+and Babylonian cuneiform glyphs. It also specifies how these characters
+are to be rendered on a screen or on paper, and how common text processing
+(word selection, line breaking, uppercasing of page titles etc.) is supposed
+to behave on Unicode text.
+</p>
+<p>Unicode also specifies three ways of storing sequences of Unicode
+characters in a computer whose basic unit of data is an 8-bit byte:
+<a name="IDX3"></a>
+<a name="IDX4"></a>
+<a name="IDX5"></a>
+<a name="IDX6"></a>
+</p><dl compact="compact">
+<dt> UTF-8</dt>
+<dd><p>Every character is represented as 1 to 4 bytes.
+</p></dd>
+<dt> UTF-16</dt>
+<dd><p>Every character is represented as 1 to 2 units of 16 bits.
+</p></dd>
+<dt> UTF-32, a.k.a. UCS-4</dt>
+<dd><p>Every character is represented as 1 unit of 32 bits.
+</p></dd>
+</dl>
+
+<p>For encoding Unicode text in a file, UTF-8 is usually used. For encoding
+Unicode strings in memory for a program, either of the three encoding forms
+can be reasonably used.
+</p>
+<p>Unicode is widely used on the web. Prior to the use of Unicode, web pages
+were in many different encodings (ISO-8859-1 for English, French, Spanish,
+ISO-8859-2 for Polish, ISO-8859-7 for Greek, KOI8-R for Russian, GB2312 or
+BIG5 for Chinese, ISO-2022-JP-2 or EUC-JP or Shift_JIS for Japanese, and many
+many others). It was next to impossible to create a document that contained
+Chinese and Polish text in the same document. Due to the many encodings for
+Japanese, even the processing of pure Japanese text was error prone.
+</p>
+<p>References:
+</p><ul>
+<li>
+The Unicode standard: <a href="http://www.unicode.org/">http://www.unicode.org/</a>
+</li><li>
+Definition of UTF-8: <a href="http://www.rfc-editor.org/rfc/rfc3629.txt">http://www.rfc-editor.org/rfc/rfc3629.txt</a>
+</li><li>
+Definition of UTF-16: <a href="http://www.rfc-editor.org/rfc/rfc2781.txt">http://www.rfc-editor.org/rfc/rfc2781.txt</a>
+</li><li>
+Markus Kuhn's UTF-8 and Unicode FAQ:
+<a href="http://www.cl.cam.ac.uk/~mgk25/unicode.html">http://www.cl.cam.ac.uk/~mgk25/unicode.html</a>
+</li></ul>
+
+<hr size="6">
+<a name="Unicode-and-i18n"></a>
+<a name="SEC3"></a>
+<h2 class="section"> <a href="libunistring.html#TOC3">1.2 Unicode and Internationalization</a> </h2>
+
+<p>Internationalization is the process of changing the source code of a program
+so that it can meet the expectations of users in any culture, if culture
+specific data (translations, images etc.) are provided.
+</p>
+<p>Use of Unicode is not strictly required for internationalization, but it
+makes internationalization much easier, because operations that need to
+look at specific characters (like hyphenation, spell checking, or the
+automatic conversion of double-quotes to opening and closing double-quote
+characters) don't need to consider multiple possible encodings of the text.
+</p>
+<p>Use of Unicode also enables multilingualization: the ability of having text
+in multiple languages present in the same document or even in the same line
+of text.
+</p>
+<p>But use of Unicode is not everything. Internationalization usually consists
+of three features:
+</p><ul>
+<li>
+Use of Unicode where needed for text processing. This is what this library
+is for.
+</li><li>
+Use of message catalogs for messages shown to the user, This is what
+GNU gettext is about.
+</li><li>
+Use of locale specific conventions for date and time formats, for numeric
+formatting, or for sorting of text. This can be done adequately with the
+POSIX APIs and the implementation of locales in the GNU C library.
+</li></ul>
+
+<hr size="6">
+<a name="Locale-encodings"></a>
+<a name="SEC4"></a>
+<h2 class="section"> <a href="libunistring.html#TOC4">1.3 Locale encodings</a> </h2>
+
+<p>A locale is a set of cultural conventions. According to POSIX, for a program,
+at any moment, there is one locale being designated as the &ldquo;current locale&rdquo;.
+(Actually, POSIX supports also one locale per thread, but this feature is not
+yet universally implemented and not widely used.)
+<a name="IDX7"></a>
+The locale is partitioned into several aspects, called the &ldquo;categories&rdquo;
+of the locale. The main various aspects are:
+</p><ul class="toc">
+<li>
+The character encoding and the character properties. This is the
+<code>LC_CTYPE</code> category.
+</li><li>
+The sorting rules for text. This is the <code>LC_COLLATE</code> category.
+</li><li>
+The language specific translations of messages. This is the
+<code>LC_MESSAGES</code> category.
+</li><li>
+The formatting rules for numbers, such as the decimal separator. This is
+the <code>LC_NUMERIC</code> category.
+</li><li>
+The formatting rules for amounts of money. This is the <code>LC_MONETARY</code>
+category.
+</li><li>
+The formatting of date and time. This is the <code>LC_TIME</code> category.
+</li></ul>
+
+<a name="IDX8"></a>
+<p>In particular, the <code>LC_CTYPE</code> category of the current locale determines
+the character encoding. This is the encoding of &lsquo;<samp>char *</samp>&rsquo; strings.
+We also call it the &ldquo;locale encoding&rdquo;. GNU libunistring has a function,
+<code>locale_charset</code>, that returns a standardized (platform independent)
+name for this encoding.
+</p>
+<p>All locale encodings used on glibc systems are essentially ASCII compatible:
+Most graphic ASCII characters have the same representation, as a single byte,
+in that encoding as in ASCII.
+</p>
+<p>Among the possible locale encodings are UTF-8 and GB18030. Both allow
+to represent any Unicode character as a sequence of bytes. UTF-8 is used in
+most of the world, whereas GB18030 is used in the People's Republic of China,
+because it is backward compatible with the GB2312 encoding that was used in
+this country earlier.
+</p>
+<p>The legacy locale encodings, ISO-8859-15 (which supplanted ISO-8859-1 in
+most of Europe), ISO-8859-2, KOI8-R, EUC-JP, etc., are still in use in
+many places, though.
+</p>
+<p>UTF-16 and UTF-32 are not used as locale encodings, because they are not
+ASCII compatible.
+</p>
+<hr size="6">
+<a name="In_002dmemory-representation"></a>
+<a name="SEC5"></a>
+<h2 class="section"> <a href="libunistring.html#TOC5">1.4 Choice of in-memory representation of strings</a> </h2>
+
+<p>There are three ways of representing strings in memory of a running
+program.
+</p><ul class="toc">
+<li>
+As &lsquo;<samp>char *</samp>&rsquo; strings. Such strings are represented in locale encoding.
+This approach is employed when not much text processing is done by the
+program. When some Unicode aware processing is to be done, a string is
+converted to Unicode on the fly and back to locale encoding afterwards.
+</li><li>
+As UTF-8 or UTF-16 or UTF-32 strings. This implies that conversion from
+locale encoding to Unicode is performed on input, and in the opposite
+direction on output. This approach is employed when the program does
+a significant amount of text processing, or when the program has multiple
+threads operating on the same data but in different locales.
+</li><li>
+As &lsquo;<samp>wchar_t *</samp>&rsquo;, a.k.a. &ldquo;wide strings&rdquo;. This approach is misguided,
+see <a href="#SEC7">The <code>wchar_t</code> mess</a>.
+</li></ul>
+
+<hr size="6">
+<a name="char-_002a-strings"></a>
+<a name="SEC6"></a>
+<h2 class="section"> <a href="libunistring.html#TOC6">1.5 &lsquo;<samp>char *</samp>&rsquo; strings</a> </h2>
+
+<p>The classical C strings, with its C library support standardized by
+ISO C and POSIX, can be used in internationalized programs with some
+precautions. The problem with this API is that many of the C library
+functions for strings don't work correctly on strings in locale
+encodings, leading to bugs that only people in some cultures of the
+world will experience.
+</p>
+<a name="IDX9"></a>
+<p>The first problem with the C library API is the support of multibyte
+locales. According to the locale encoding, in general, every character
+is represented by one or more bytes (up to 4 bytes in practice &mdash; but
+use <code>MB_LEN_MAX</code> instead of the number 4 in the code).
+When every character is represented by only 1 byte, we speak of an
+&ldquo;unibyte locale&rdquo;, otherwise of a &ldquo;multibyte locale&rdquo;. It is important
+to realize that the majority of Unix installations nowadays use UTF-8
+or GB18030 as locale encoding; therefore, the majority of users are
+using multibyte locales.
+</p>
+<a name="IDX10"></a>
+<p>The important fact to remember is:
+</p><table class="cartouche" border="1"><tr><td>
+<p><em>A &lsquo;<samp>char</samp>&rsquo; is a byte, not a character.</em>
+</p></td></tr></table>
+
+<p>As a consequence:
+</p><ul class="toc">
+<li>
+The <code>&lt;ctype.h&gt;</code> API is useless in this context; it does not work in
+multibyte locales.
+</li><li>
+The <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strlen.html"><code>strlen</code></a> function does not return the number of characters
+in a string. Nor does it return the number of screen columns occupied
+by a string after it is output. It merely returns the number of
+<em>bytes</em> occupied by a string.
+</li><li>
+Truncating a string, for example, with <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strncpy.html"><code>strncpy</code></a>, can have the
+effect of truncating it in the middle of a multibyte character. Such
+a string will, when output, have a garbled character at its end, often
+represented by a hollow box.
+</li><li>
+<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strchr.html"><code>strchr</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strrchr.html"><code>strrchr</code></a> do not work with multibyte strings
+if the locale encoding is GB18030 and the character to be searched is
+a digit.
+</li><li>
+<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strstr.html"><code>strstr</code></a> does not work with multibyte strings if the locale encoding
+is different from UTF-8.
+</li><li>
+<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strcspn.html"><code>strcspn</code></a>, <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strpbrk.html"><code>strpbrk</code></a>, <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strspn.html"><code>strspn</code></a> cannot work
+correctly in multibyte locales: they assume the second argument is a list of
+single-byte characters. Even in this simple case, they do not work with
+multibyte strings if the locale encoding is GB18030 and one of the
+characters to be searched is a digit.
+</li><li>
+<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strsep.html"><code>strsep</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strtok_r.html"><code>strtok_r</code></a> do not work with multibyte strings
+unless all of the delimiter characters are ASCII characters &lt; 0x30.
+</li><li>
+The <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strcasecmp.html"><code>strcasecmp</code></a>, <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strncasecmp.html"><code>strncasecmp</code></a>, and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strcasestr.html"><code>strcasestr</code></a>
+functions do not work with multibyte strings.
+</li></ul>
+
+<p>The workarounds can be found in GNU gnulib
+<a href="http://www.gnu.org/software/gnulib/">http://www.gnu.org/software/gnulib/</a>.
+</p><ul class="toc">
+<li>
+gnulib has modules &lsquo;<samp>mbchar</samp>&rsquo;, &lsquo;<samp>mbiter</samp>&rsquo;, &lsquo;<samp>mbuiter</samp>&rsquo; that
+represent multibyte characters and allow to iterate across a multibyte
+string with the same ease as through a unibyte string.
+</li><li>
+gnulib has functions <code>mbslen</code> and <code>mbswidth</code> that can be
+used instead of <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strlen.html"><code>strlen</code></a> when the number of characters or the
+number of screen columns of a string is requested.
+</li><li>
+gnulib has functions <code>mbschr</code> and <code>mbsrrchr</code> that are
+like <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strchr.html"><code>strchr</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strrchr.html"><code>strrchr</code></a>, but work in multibyte locales.
+</li><li>
+gnulib has a function <code>mbsstr</code>, like <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strstr.html"><code>strstr</code></a>, but works
+in multibyte locales.
+</li><li>
+gnulib has functions <code>mbscspn</code>, <code>mbspbrk</code>, <code>mbsspn</code>
+that are like <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strcspn.html"><code>strcspn</code></a>, <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strpbrk.html"><code>strpbrk</code></a>, <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strspn.html"><code>strspn</code></a>, but
+work in multibyte locales.
+</li><li>
+gnulib has functions <code>mbssep</code> and <code>mbstok_r</code> that are
+like <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strsep.html"><code>strsep</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strtok_r.html"><code>strtok_r</code></a> but work in multibyte locales.
+</li><li>
+gnulib has functions <code>mbscasecmp</code>, <code>mbsncasecmp</code>,
+<code>mbspcasecmp</code>, and <code>mbscasestr</code> that are like <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strcasecmp.html"><code>strcasecmp</code></a>,
+<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strncasecmp.html"><code>strncasecmp</code></a>, and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strcasestr.html"><code>strcasestr</code></a>, but
+work in multibyte locales. Still, the function <code>ulc_casecmp</code> is
+preferable to these functions; see below.
+</li></ul>
+
+<p>The second problem with the C library API is that it has some assumptions built-in that are not valid in some languages:
+</p><ul class="toc">
+<li>
+It assumes that there are only two forms of every character: uppercase
+and lowercase. This is not true for Croatian, where the character
+<small>LETTER DZ WITH CARON</small> comes in three forms:
+<small>LATIN CAPITAL LETTER DZ WITH CARON</small> (DZ),
+<small>LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON</small> (Dz),
+<small>LATIN SMALL LETTER DZ WITH CARON</small> (dz).
+</li><li>
+It assumes that uppercasing of 1 character leads to 1 character. This
+is not true for German, where the <small>LATIN SMALL LETTER SHARP S</small>, when
+uppercased, becomes &lsquo;<samp>SS</samp>&rsquo;.
+</li><li>
+It assumes that there is 1:1 mapping between uppercase and lowercase forms.
+This is not true for the Greek sigma: <small>GREEK CAPITAL LETTER SIGMA</small> is
+the uppercase of both <small>GREEK SMALL LETTER SIGMA</small> and
+<small>GREEK SMALL LETTER FINAL SIGMA</small>.
+</li><li>
+It assumes that the upper/lowercase mappings are position independent.
+This is not true for the Greek sigma and the Lithuanian i.
+</li></ul>
+
+<p>The correct way to deal with this problem is
+</p><ol>
+<li>
+to provide functions for titlecasing, as well as for upper- and
+lowercasing,
+</li><li>
+to view case transformations as functions that operates on strings,
+rather than on characters.
+</li></ol>
+
+<p>This is implemented in this library, through the functions declared in <code>&lt;unicase.h&gt;</code>, see <a href="libunistring_13.html#SEC48">Case mappings <code>&lt;unicase.h&gt;</code></a>.
+</p>
+<hr size="6">
+<a name="The-wchar_005ft-mess"></a>
+<a name="SEC7"></a>
+<h2 class="section"> <a href="libunistring.html#TOC7">1.6 The <code>wchar_t</code> mess</a> </h2>
+
+<p>The ISO C and POSIX standard creators made an attempt to fix the first
+problem mentioned in the previous section. They introduced
+</p><ul class="toc">
+<li>
+a type &lsquo;<samp>wchar_t</samp>&rsquo;, designed to encapsulate an entire character,
+</li><li>
+a &ldquo;wide string&rdquo; type &lsquo;<samp>wchar_t *</samp>&rsquo;, and
+</li><li>
+functions declared in <code>&lt;wctype.h&gt;</code> that were meant to supplant the
+ones in <code>&lt;ctype.h&gt;</code>.
+</li></ul>
+
+<p>Unfortunately, this API and its implementation has numerous problems:
+</p>
+<ul class="toc">
+<li>
+On AIX and Windows platforms, <code>wchar_t</code> is a 16-bit type. This
+means that it can never accommodate an entire Unicode character. Either
+the <code>wchar_t *</code> strings are limited to characters in UCS-2 (the
+&ldquo;Basic Multilingual Plane&rdquo; of Unicode), or &mdash; if <code>wchar_t *</code>
+strings are encoded in UTF-16 &mdash; a <code>wchar_t</code> represents only half
+of a character in the worst case, making the <code>&lt;wctype.h&gt;</code> functions
+pointless.
+
+</li><li>
+On Solaris and FreeBSD, the <code>wchar_t</code> encoding is locale dependent
+and undocumented. This means, if you want to know any property of a
+<code>wchar_t</code> character, other than the properties defined by
+<code>&lt;wctype.h&gt;</code> &mdash; such as whether it's a dash, currency symbol,
+paragraph separator, or similar &mdash;, you have to convert it to
+<code>char *</code> encoding first, by use of the function <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wctomb.html"><code>wctomb</code></a>.
+
+</li><li>
+When you read a stream of wide characters, through the functions
+<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/fgetwc.html"><code>fgetwc</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/fgetws.html"><code>fgetws</code></a>, and when the input stream/file is
+not in the expected encoding, you have no way to determine the invalid
+byte sequence and do some corrective action. If you use these
+functions, your program becomes &ldquo;garbage in - more garbage out&rdquo; or
+&ldquo;garbage in - abort&rdquo;.
+</li></ul>
+
+<p>As a consequence, it is better to use multibyte strings, as explained in
+the previous section. Such multibyte strings can bypass limitations
+of the <code>wchar_t</code> type, if you use functions defined in gnulib and
+libunistring for text processing. They can also faithfully transport
+malformed characters that were present in the input, without requiring
+the program to produce garbage or abort.
+</p>
+<hr size="6">
+<a name="Unicode-strings"></a>
+<a name="SEC8"></a>
+<h2 class="section"> <a href="libunistring.html#TOC8">1.7 Unicode strings</a> </h2>
+
+<p>libunistring supports Unicode strings in three representations:
+<a name="IDX11"></a>
+<a name="IDX12"></a>
+<a name="IDX13"></a>
+</p><ul class="toc">
+<li>
+UTF-8 strings, through the type &lsquo;<samp>uint8_t *</samp>&rsquo;. The units are bytes
+(<code>uint8_t</code>).
+</li><li>
+UTF-16 strings, through the type &lsquo;<samp>uint16_t *</samp>&rsquo;, The units are 16-bit
+memory words (<code>uint16_t</code>).
+</li><li>
+UTF-32 strings, through the type &lsquo;<samp>uint32_t *</samp>&rsquo;. The units are 32-bit
+memory words (<code>uint32_t</code>).
+</li></ul>
+
+<p>As with C strings, there are two variants:
+</p><ul class="toc">
+<li>
+Unicode strings with a terminating NUL character are represented as
+a pointer to the first unit of the string. There is a unit containing
+a 0 value at the end. It is considered part of the string for all
+memory allocation purposes, but is not considered part of the string
+for all other logical purposes.
+</li><li>
+Unicode strings where embedded NUL characters are allowed. These
+are represented by a pointer to the first unit and the number of units
+(not bytes!) of the string. In this setting, there is no trailing
+zero-valued unit used as &ldquo;end marker&rdquo;.
+</li></ul>
+
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC1" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_2.html#SEC9" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_10.html b/doc/libunistring_10.html
new file mode 100644
index 00000000..bf22ca1b
--- /dev/null
+++ b/doc/libunistring_10.html
@@ -0,0 +1,192 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: 10. Word breaks in strings &lt;uniwbrk.h&gt;</title>
+
+<meta name="description" content="GNU libunistring: 10. Word breaks in strings &lt;uniwbrk.h&gt;">
+<meta name="keywords" content="GNU libunistring: 10. Word breaks in strings &lt;uniwbrk.h&gt;">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_9.html#SEC37" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_11.html#SEC41" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="uniwbrk_002eh"></a>
+<a name="SEC38"></a>
+<h1 class="chapter"> <a href="libunistring.html#TOC38">10. Word breaks in strings <code>&lt;uniwbrk.h&gt;</code></a> </h1>
+
+<p>This include file declares functions for determining where in a string
+&ldquo;words&rdquo; start and end. Here &ldquo;words&rdquo; are not necessarily the same as
+entities that can be looked up in dictionaries, but rather groups of
+consecutive characters that should not be split by text processing
+operations.
+</p>
+
+<hr size="6">
+<a name="Word-breaks-in-a-string"></a>
+<a name="SEC39"></a>
+<h2 class="section"> <a href="libunistring.html#TOC39">10.1 Word breaks in a string</a> </h2>
+
+<p>The following functions determine the word breaks in a string.
+</p>
+<dl>
+<dt><u>Function:</u> void <b>u8_wordbreaks</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, char *<var>p</var>)</i>
+<a name="IDX615"></a>
+</dt>
+<dt><u>Function:</u> void <b>u16_wordbreaks</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, char *<var>p</var>)</i>
+<a name="IDX616"></a>
+</dt>
+<dt><u>Function:</u> void <b>u32_wordbreaks</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, char *<var>p</var>)</i>
+<a name="IDX617"></a>
+</dt>
+<dt><u>Function:</u> void <b>ulc_wordbreaks</b><i> (const char *<var>s</var>, size_t <var>n</var>, char *<var>p</var>)</i>
+<a name="IDX618"></a>
+</dt>
+<dd><p>Determines the word break points in <var>s</var>, an array of <var>n</var> units, and
+stores the result at <code><var>p</var>[0..<var>n</var>-1]</code>.
+</p><dl compact="compact">
+<dt> <code><var>p</var>[i] = 1</code></dt>
+<dd><p>means that there is a word boundary between <code><var>s</var>[i-1]</code> and
+<code><var>s</var>[i]</code>.
+</p></dd>
+<dt> <code><var>p</var>[i] = 0</code></dt>
+<dd><p>means that <code><var>s</var>[i-1]</code> and <code><var>s</var>[i]</code> must not be separated.
+</p></dd>
+</dl>
+<p><code><var>p</var>[0]</code> is always set to 0. If an application wants to consider a
+word break to be present at the beginning of the string (before
+<code><var>s</var>[0]</code>) or at the end of the string (after
+<code><var>s</var>[0..<var>n</var>-1]</code>), it has to treat these cases explicitly.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Word-break-property"></a>
+<a name="SEC40"></a>
+<h2 class="section"> <a href="libunistring.html#TOC40">10.2 Word break property</a> </h2>
+
+<p>This is a more low-level API. The word break property is a property defined
+in Unicode Standard Annex #29, section &ldquo;Word Boundaries&rdquo;, see
+<a href="http://www.unicode.org/reports/tr29/#Word_Boundaries">http://www.unicode.org/reports/tr29/#Word_Boundaries</a>. It is
+used for determining the word breaks in a string.
+</p>
+<p>The following are the possible values of the word break property. More values
+may be added in the future.
+</p>
+<dl>
+<dt><u>Constant:</u> int <b>WBP_OTHER</b>
+<a name="IDX619"></a>
+</dt>
+<dt><u>Constant:</u> int <b>WBP_CR</b>
+<a name="IDX620"></a>
+</dt>
+<dt><u>Constant:</u> int <b>WBP_LF</b>
+<a name="IDX621"></a>
+</dt>
+<dt><u>Constant:</u> int <b>WBP_NEWLINE</b>
+<a name="IDX622"></a>
+</dt>
+<dt><u>Constant:</u> int <b>WBP_EXTEND</b>
+<a name="IDX623"></a>
+</dt>
+<dt><u>Constant:</u> int <b>WBP_FORMAT</b>
+<a name="IDX624"></a>
+</dt>
+<dt><u>Constant:</u> int <b>WBP_KATAKANA</b>
+<a name="IDX625"></a>
+</dt>
+<dt><u>Constant:</u> int <b>WBP_ALETTER</b>
+<a name="IDX626"></a>
+</dt>
+<dt><u>Constant:</u> int <b>WBP_MIDNUMLET</b>
+<a name="IDX627"></a>
+</dt>
+<dt><u>Constant:</u> int <b>WBP_MIDLETTER</b>
+<a name="IDX628"></a>
+</dt>
+<dt><u>Constant:</u> int <b>WBP_MIDNUM</b>
+<a name="IDX629"></a>
+</dt>
+<dt><u>Constant:</u> int <b>WBP_NUMERIC</b>
+<a name="IDX630"></a>
+</dt>
+<dt><u>Constant:</u> int <b>WBP_EXTENDNUMLET</b>
+<a name="IDX631"></a>
+</dt>
+</dl>
+
+<p>The following function looks up the word break property of a character.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>uc_wordbreak_property</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX632"></a>
+</dt>
+<dd><p>Returns the Word_Break property of a Unicode character.
+</p></dd></dl>
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC38" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_11.html#SEC41" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_11.html b/doc/libunistring_11.html
new file mode 100644
index 00000000..b0016788
--- /dev/null
+++ b/doc/libunistring_11.html
@@ -0,0 +1,200 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: 11. Line breaking &lt;unilbrk.h&gt;</title>
+
+<meta name="description" content="GNU libunistring: 11. Line breaking &lt;unilbrk.h&gt;">
+<meta name="keywords" content="GNU libunistring: 11. Line breaking &lt;unilbrk.h&gt;">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_10.html#SEC38" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_12.html#SEC42" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="unilbrk_002eh"></a>
+<a name="SEC41"></a>
+<h1 class="chapter"> <a href="libunistring.html#TOC41">11. Line breaking <code>&lt;unilbrk.h&gt;</code></a> </h1>
+
+<p>This include file declares functions for determining where in a string
+line breaks could or should be introduced, in order to make the displayed
+string fit into a column of given width.
+</p>
+<p>These functions are locale dependent. The <var>encoding</var> argument identifies
+the encoding (e.g. <code>&quot;ISO-8859-2&quot;</code> for Polish).
+</p>
+<p>The following enumerated values indicate whether, at a given position, a line
+break is possible or not. Given an string <var>s</var> as an array
+<code><var>s</var>[0..<var>n</var>-1]</code> and a position <var>i</var>, the values have the
+following meanings:
+</p>
+<dl>
+<dt><u>Constant:</u> int <b>UC_BREAK_MANDATORY</b>
+<a name="IDX633"></a>
+</dt>
+<dd><p>This value indicates that <code><var>s</var>[<var>i</var>]</code> is a line break character.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BREAK_POSSIBLE</b>
+<a name="IDX634"></a>
+</dt>
+<dd><p>This value indicates that a line break may be inserted between
+<code><var>s</var>[<var>i</var>-1]</code> and <code><var>s</var>[<var>i</var>]</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BREAK_HYPHENATION</b>
+<a name="IDX635"></a>
+</dt>
+<dd><p>This value indicates that a hyphen and a line break may be inserted between
+<code><var>s</var>[<var>i</var>-1]</code> and <code><var>s</var>[<var>i</var>]</code>. But beware of language
+dependent hyphenation rules.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BREAK_PROHIBITED</b>
+<a name="IDX636"></a>
+</dt>
+<dd><p>This value indicates that <code><var>s</var>[<var>i</var>-1]</code> and <code><var>s</var>[<var>i</var>]</code>
+must not be separated.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BREAK_UNDEFINED</b>
+<a name="IDX637"></a>
+</dt>
+<dd><p>This value is not used as a return value; rather, in the overriding argument of
+the <code>u*_width_linebreaks</code> functions, it indicates the absence of an
+override.
+</p></dd></dl>
+
+<p>The following functions determine the positions at which line breaks are
+possible.
+</p>
+<dl>
+<dt><u>Function:</u> void <b>u8_possible_linebreaks</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, const char *<var>encoding</var>, char *<var>p</var>)</i>
+<a name="IDX638"></a>
+</dt>
+<dt><u>Function:</u> void <b>u16_possible_linebreaks</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, const char *<var>encoding</var>, char *<var>p</var>)</i>
+<a name="IDX639"></a>
+</dt>
+<dt><u>Function:</u> void <b>u32_possible_linebreaks</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, const char *<var>encoding</var>, char *<var>p</var>)</i>
+<a name="IDX640"></a>
+</dt>
+<dt><u>Function:</u> void <b>ulc_possible_linebreaks</b><i> (const char *<var>s</var>, size_t <var>n</var>, const char *<var>encoding</var>, char *<var>p</var>)</i>
+<a name="IDX641"></a>
+</dt>
+<dd><p>Determines the line break points in <var>s</var>, and stores the result at
+<code><var>p</var>[0..<var>n</var>-1]</code>. Every <code><var>p</var>[<var>i</var>]</code> is assigned one of
+the values <code>UC_BREAK_MANDATORY</code>, <code>UC_BREAK_POSSIBLE</code>,
+<code>UC_BREAK_HYPHENATION</code>, <code>UC_BREAK_PROHIBITED</code>.
+</p></dd></dl>
+
+<p>The following functions determine where line breaks should be inserted so that
+each line fits in a given width, when output to a device that uses
+non-proportional fonts.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>u8_width_linebreaks</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, int <var>width</var>, int <var>start_column</var>, int <var>at_end_columns</var>, const char *<var>override</var>, const char *<var>encoding</var>, char *<var>p</var>)</i>
+<a name="IDX642"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_width_linebreaks</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, int <var>width</var>, int <var>start_column</var>, int <var>at_end_columns</var>, const char *<var>override</var>, const char *<var>encoding</var>, char *<var>p</var>)</i>
+<a name="IDX643"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_width_linebreaks</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, int <var>width</var>, int <var>start_column</var>, int <var>at_end_columns</var>, const char *<var>override</var>, const char *<var>encoding</var>, char *<var>p</var>)</i>
+<a name="IDX644"></a>
+</dt>
+<dt><u>Function:</u> int <b>ulc_width_linebreaks</b><i> (const char *<var>s</var>, size_t <var>n</var>, int <var>width</var>, int <var>start_column</var>, int <var>at_end_columns</var>, const char *<var>override</var>, const char *<var>encoding</var>, char *<var>p</var>)</i>
+<a name="IDX645"></a>
+</dt>
+<dd><p>Chooses the best line breaks, assuming that every character occupies a width
+given by the <code>uc_width</code> function (see <a href="libunistring_9.html#SEC37">Display width <code>&lt;uniwidth.h&gt;</code></a>).
+</p>
+<p>The string is <code><var>s</var>[0..<var>n</var>-1]</code>.
+</p>
+<p>The maximum number of columns per line is given as <var>width</var>.
+The starting column of the string is given as <var>start_column</var>.
+If the algorithm shall keep room after the last piece, this amount of room can
+be given as <var>at_end_columns</var>.
+</p>
+<p><var>override</var> is an optional override; if
+<code><var>override</var>[<var>i</var>] != UC_BREAK_UNDEFINED</code>,
+<code><var>override</var>[<var>i</var>]</code> takes precedence over <code><var>p</var>[<var>i</var>]</code>
+as returned by the <code>u*_possible_linebreaks</code> function.
+</p>
+<p>The given <var>encoding</var> is used for disambiguating widths in <code>uc_width</code>.
+</p>
+<p>Returns the column after the end of the string, and stores the result at
+<code><var>p</var>[0..<var>n</var>-1]</code>. Every <code><var>p</var>[<var>i</var>]</code> is assigned one of
+the values <code>UC_BREAK_MANDATORY</code>, <code>UC_BREAK_POSSIBLE</code>,
+<code>UC_BREAK_HYPHENATION</code>, <code>UC_BREAK_PROHIBITED</code>. Here the value
+<code>UC_BREAK_POSSIBLE</code> indicates that a line break <em>should</em> be inserted.
+</p></dd></dl>
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_10.html#SEC38" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_12.html#SEC42" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_12.html b/doc/libunistring_12.html
new file mode 100644
index 00000000..0bf1e933
--- /dev/null
+++ b/doc/libunistring_12.html
@@ -0,0 +1,507 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: 12. Normalization forms (composition and decomposition) &lt;uninorm.h&gt;</title>
+
+<meta name="description" content="GNU libunistring: 12. Normalization forms (composition and decomposition) &lt;uninorm.h&gt;">
+<meta name="keywords" content="GNU libunistring: 12. Normalization forms (composition and decomposition) &lt;uninorm.h&gt;">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_11.html#SEC41" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_13.html#SEC48" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="uninorm_002eh"></a>
+<a name="SEC42"></a>
+<h1 class="chapter"> <a href="libunistring.html#TOC42">12. Normalization forms (composition and decomposition) <code>&lt;uninorm.h&gt;</code></a> </h1>
+
+<p>This include file defines functions for transforming Unicode strings to one
+of the four normal forms, known as NFC, NFD, NKFC, NFKD. These
+transformations involve decomposition and &mdash; for NFC and NFKC &mdash; composition
+of Unicode characters.
+</p>
+
+<hr size="6">
+<a name="Decomposition-of-characters"></a>
+<a name="SEC43"></a>
+<h2 class="section"> <a href="libunistring.html#TOC43">12.1 Decomposition of Unicode characters</a> </h2>
+
+<p>The following enumerated values are the possible types of decomposition of a
+Unicode character.
+</p>
+<dl>
+<dt><u>Constant:</u> int <b>UC_DECOMP_CANONICAL</b>
+<a name="IDX646"></a>
+</dt>
+<dd><p>Denotes canonical decomposition.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_DECOMP_FONT</b>
+<a name="IDX647"></a>
+</dt>
+<dd><p>UCD marker: <code>&lt;font&gt;</code>. Denotes a font variant (e.g. a blackletter form).
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_DECOMP_NOBREAK</b>
+<a name="IDX648"></a>
+</dt>
+<dd><p>UCD marker: <code>&lt;noBreak&gt;</code>.
+Denotes a no-break version of a space or hyphen.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_DECOMP_INITIAL</b>
+<a name="IDX649"></a>
+</dt>
+<dd><p>UCD marker: <code>&lt;initial&gt;</code>.
+Denotes an initial presentation form (Arabic).
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_DECOMP_MEDIAL</b>
+<a name="IDX650"></a>
+</dt>
+<dd><p>UCD marker: <code>&lt;medial&gt;</code>.
+Denotes a medial presentation form (Arabic).
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_DECOMP_FINAL</b>
+<a name="IDX651"></a>
+</dt>
+<dd><p>UCD marker: <code>&lt;final&gt;</code>.
+Denotes a final presentation form (Arabic).
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_DECOMP_ISOLATED</b>
+<a name="IDX652"></a>
+</dt>
+<dd><p>UCD marker: <code>&lt;isolated&gt;</code>.
+Denotes an isolated presentation form (Arabic).
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_DECOMP_CIRCLE</b>
+<a name="IDX653"></a>
+</dt>
+<dd><p>UCD marker: <code>&lt;circle&gt;</code>.
+Denotes an encircled form.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_DECOMP_SUPER</b>
+<a name="IDX654"></a>
+</dt>
+<dd><p>UCD marker: <code>&lt;super&gt;</code>.
+Denotes a superscript form.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_DECOMP_SUB</b>
+<a name="IDX655"></a>
+</dt>
+<dd><p>UCD marker: <code>&lt;sub&gt;</code>.
+Denotes a subscript form.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_DECOMP_VERTICAL</b>
+<a name="IDX656"></a>
+</dt>
+<dd><p>UCD marker: <code>&lt;vertical&gt;</code>.
+Denotes a vertical layout presentation form.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_DECOMP_WIDE</b>
+<a name="IDX657"></a>
+</dt>
+<dd><p>UCD marker: <code>&lt;wide&gt;</code>.
+Denotes a wide (or zenkaku) compatibility character.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_DECOMP_NARROW</b>
+<a name="IDX658"></a>
+</dt>
+<dd><p>UCD marker: <code>&lt;narrow&gt;</code>.
+Denotes a narrow (or hankaku) compatibility character.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_DECOMP_SMALL</b>
+<a name="IDX659"></a>
+</dt>
+<dd><p>UCD marker: <code>&lt;small&gt;</code>.
+Denotes a small variant form (CNS compatibility).
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_DECOMP_SQUARE</b>
+<a name="IDX660"></a>
+</dt>
+<dd><p>UCD marker: <code>&lt;square&gt;</code>.
+Denotes a CJK squared font variant.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_DECOMP_FRACTION</b>
+<a name="IDX661"></a>
+</dt>
+<dd><p>UCD marker: <code>&lt;fraction&gt;</code>.
+Denotes a vulgar fraction form.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_DECOMP_COMPAT</b>
+<a name="IDX662"></a>
+</dt>
+<dd><p>UCD marker: <code>&lt;compat&gt;</code>.
+Denotes an otherwise unspecified compatibility character.
+</p></dd></dl>
+
+<p>The following constant denotes the maximum size of decomposition of a single
+Unicode character.
+</p>
+<dl>
+<dt><u>Macro:</u> unsigned int <b>UC_DECOMPOSITION_MAX_LENGTH</b>
+<a name="IDX663"></a>
+</dt>
+<dd><p>This macro expands to a constant that is the required size of buffer passed to
+the <code>uc_decomposition</code> and <code>uc_canonical_decomposition</code> functions.
+</p></dd></dl>
+
+<p>The following functions decompose a Unicode character.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>uc_decomposition</b><i> (ucs4_t <var>uc</var>, int *<var>decomp_tag</var>, ucs4_t *<var>decomposition</var>)</i>
+<a name="IDX664"></a>
+</dt>
+<dd><p>Returns the character decomposition mapping of the Unicode character <var>uc</var>.
+<var>decomposition</var> must point to an array of at least
+<code>UC_DECOMPOSITION_MAX_LENGTH</code> <code>ucs_t</code> elements.
+</p>
+<p>When a decomposition exists, <code><var>decomposition</var>[0..<var>n</var>-1]</code> and
+<code>*<var>decomp_tag</var></code> are filled and <var>n</var> is returned. Otherwise -1 is
+returned.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> int <b>uc_canonical_decomposition</b><i> (ucs4_t <var>uc</var>, ucs4_t *<var>decomposition</var>)</i>
+<a name="IDX665"></a>
+</dt>
+<dd><p>Returns the canonical character decomposition mapping of the Unicode character
+<var>uc</var>. <var>decomposition</var> must point to an array of at least
+<code>UC_DECOMPOSITION_MAX_LENGTH</code> <code>ucs_t</code> elements.
+</p>
+<p>When a decomposition exists, <code><var>decomposition</var>[0..<var>n</var>-1]</code> is filled
+and <var>n</var> is returned. Otherwise -1 is returned.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Composition-of-characters"></a>
+<a name="SEC44"></a>
+<h2 class="section"> <a href="libunistring.html#TOC44">12.2 Composition of Unicode characters</a> </h2>
+
+<p>The following function composes a Unicode character from two Unicode
+characters.
+</p>
+<dl>
+<dt><u>Function:</u> ucs4_t <b>uc_composition</b><i> (ucs4_t <var>uc1</var>, ucs4_t <var>uc2</var>)</i>
+<a name="IDX666"></a>
+</dt>
+<dd><p>Attempts to combine the Unicode characters <var>uc1</var>, <var>uc2</var>.
+<var>uc1</var> is known to have canonical combining class 0.
+</p>
+<p>Returns the combination of <var>uc1</var> and <var>uc2</var>, if it exists.
+Returns 0 otherwise.
+</p>
+<p>Not all decompositions can be recombined using this function. See the Unicode
+file &lsquo;<tt>CompositionExclusions.txt</tt>&rsquo; for details.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Normalization-of-strings"></a>
+<a name="SEC45"></a>
+<h2 class="section"> <a href="libunistring.html#TOC45">12.3 Normalization of strings</a> </h2>
+
+<p>The Unicode standard defines four normalization forms for Unicode strings.
+The following type is used to denote a normalization form.
+</p>
+<dl>
+<dt><u>Type:</u> <b>uninorm_t</b>
+<a name="IDX667"></a>
+</dt>
+<dd><p>An object of type <code>uninorm_t</code> denotes a Unicode normalization form.
+This is a scalar type; its values can be compared with <code>==</code>.
+</p></dd></dl>
+
+<p>The following constants denote the four normalization forms.
+</p>
+<dl>
+<dt><u>Macro:</u> uninorm_t <b>UNINORM_NFD</b>
+<a name="IDX668"></a>
+</dt>
+<dd><p>Denotes Normalization form D: canonical decomposition.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uninorm_t <b>UNINORM_NFC</b>
+<a name="IDX669"></a>
+</dt>
+<dd><p>Normalization form C: canonical decomposition, then canonical composition.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uninorm_t <b>UNINORM_NFKD</b>
+<a name="IDX670"></a>
+</dt>
+<dd><p>Normalization form KD: compatibility decomposition.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uninorm_t <b>UNINORM_NFKC</b>
+<a name="IDX671"></a>
+</dt>
+<dd><p>Normalization form KC: compatibility decomposition, then canonical composition.
+</p></dd></dl>
+
+<p>The following functions operate on <code>uninorm_t</code> objects.
+</p>
+<dl>
+<dt><u>Function:</u> bool <b>uninorm_is_compat_decomposing</b><i> (uninorm_t <var>nf</var>)</i>
+<a name="IDX672"></a>
+</dt>
+<dd><p>Tests whether the normalization form <var>nf</var> does compatibility decomposition.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>uninorm_is_composing</b><i> (uninorm_t <var>nf</var>)</i>
+<a name="IDX673"></a>
+</dt>
+<dd><p>Tests whether the normalization form <var>nf</var> includes canonical composition.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uninorm_t <b>uninorm_decomposing_form</b><i> (uninorm_t <var>nf</var>)</i>
+<a name="IDX674"></a>
+</dt>
+<dd><p>Returns the decomposing variant of the normalization form <var>nf</var>.
+This maps NFC,NFD → NFD and NFKC,NFKD → NFKD.
+</p></dd></dl>
+
+<p>The following functions apply a Unicode normalization form to a Unicode string.
+</p>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_normalize</b><i> (uninorm_t <var>nf</var>, const uint8_t *<var>s</var>, size_t <var>n</var>, uint8_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX675"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_normalize</b><i> (uninorm_t <var>nf</var>, const uint16_t *<var>s</var>, size_t <var>n</var>, uint16_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX676"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_normalize</b><i> (uninorm_t <var>nf</var>, const uint32_t *<var>s</var>, size_t <var>n</var>, uint32_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX677"></a>
+</dt>
+<dd><p>Returns the specified normalization form of a string.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Normalizing-comparisons"></a>
+<a name="SEC46"></a>
+<h2 class="section"> <a href="libunistring.html#TOC46">12.4 Normalizing comparisons</a> </h2>
+
+<p>The following functions compare Unicode string, ignoring differences in
+normalization.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>u8_normcmp</b><i> (const uint8_t *<var>s1</var>, size_t <var>n1</var>, const uint8_t *<var>s2</var>, size_t <var>n2</var>, uninorm_t <var>nf</var>, int *<var>resultp</var>)</i>
+<a name="IDX678"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_normcmp</b><i> (const uint16_t *<var>s1</var>, size_t <var>n1</var>, const uint16_t *<var>s2</var>, size_t <var>n2</var>, uninorm_t <var>nf</var>, int *<var>resultp</var>)</i>
+<a name="IDX679"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_normcmp</b><i> (const uint32_t *<var>s1</var>, size_t <var>n1</var>, const uint32_t *<var>s2</var>, size_t <var>n2</var>, uninorm_t <var>nf</var>, int *<var>resultp</var>)</i>
+<a name="IDX680"></a>
+</dt>
+<dd><p>Compares <var>s1</var> and <var>s2</var>, ignoring differences in normalization.
+</p>
+<p><var>nf</var> must be either <code>UNINORM_NFD</code> or <code>UNINORM_NFKD</code>.
+</p>
+<p>If successful, sets <code>*<var>resultp</var></code> to -1 if <var>s1</var> &lt; <var>s2</var>,
+0 if <var>s1</var> = <var>s2</var>, 1 if <var>s1</var> &gt; <var>s2</var>, and returns 0.
+Upon failure, returns -1 with <code>errno</code> set.
+</p></dd></dl>
+
+<a name="IDX681"></a>
+<a name="IDX682"></a>
+<dl>
+<dt><u>Function:</u> char * <b>u8_normxfrm</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, uninorm_t <var>nf</var>, char *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX683"></a>
+</dt>
+<dt><u>Function:</u> char * <b>u16_normxfrm</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, uninorm_t <var>nf</var>, char *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX684"></a>
+</dt>
+<dt><u>Function:</u> char * <b>u32_normxfrm</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, uninorm_t <var>nf</var>, char *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX685"></a>
+</dt>
+<dd><p>Converts the string <var>s</var> of length <var>n</var> to a NUL-terminated byte
+sequence, in such a way that comparing <code>u8_normxfrm (<var>s1</var>)</code> and
+<code>u8_normxfrm (<var>s2</var>)</code> with the <code>u8_cmp2</code> function is equivalent to
+comparing <var>s1</var> and <var>s2</var> with the <code>u8_normcoll</code> function.
+</p>
+<p><var>nf</var> must be either <code>UNINORM_NFC</code> or <code>UNINORM_NFKC</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> int <b>u8_normcoll</b><i> (const uint8_t *<var>s1</var>, size_t <var>n1</var>, const uint8_t *<var>s2</var>, size_t <var>n2</var>, uninorm_t <var>nf</var>, int *<var>resultp</var>)</i>
+<a name="IDX686"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_normcoll</b><i> (const uint16_t *<var>s1</var>, size_t <var>n1</var>, const uint16_t *<var>s2</var>, size_t <var>n2</var>, uninorm_t <var>nf</var>, int *<var>resultp</var>)</i>
+<a name="IDX687"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_normcoll</b><i> (const uint32_t *<var>s1</var>, size_t <var>n1</var>, const uint32_t *<var>s2</var>, size_t <var>n2</var>, uninorm_t <var>nf</var>, int *<var>resultp</var>)</i>
+<a name="IDX688"></a>
+</dt>
+<dd><p>Compares <var>s1</var> and <var>s2</var>, ignoring differences in normalization, using
+the collation rules of the current locale.
+</p>
+<p><var>nf</var> must be either <code>UNINORM_NFC</code> or <code>UNINORM_NFKC</code>.
+</p>
+<p>If successful, sets <code>*<var>resultp</var></code> to -1 if <var>s1</var> &lt; <var>s2</var>,
+0 if <var>s1</var> = <var>s2</var>, 1 if <var>s1</var> &gt; <var>s2</var>, and returns 0.
+Upon failure, returns -1 with <code>errno</code> set.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Normalization-of-streams"></a>
+<a name="SEC47"></a>
+<h2 class="section"> <a href="libunistring.html#TOC47">12.5 Normalization of streams of Unicode characters</a> </h2>
+
+<p>A &ldquo;stream of Unicode characters&rdquo; is essentially a function that accepts an
+<code>ucs4_t</code> argument repeatedly, optionally combined with a function that
+&ldquo;flushes&rdquo; the stream.
+</p>
+<dl>
+<dt><u>Type:</u> <b>struct uninorm_filter</b>
+<a name="IDX689"></a>
+</dt>
+<dd><p>This is the data type of a stream of Unicode characters that normalizes its
+input according to a given normalization form and passes the normalized
+character sequence to the encapsulated stream of Unicode characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> struct uninorm_filter * <b>uninorm_filter_create</b><i> (uninorm_t <var>nf</var>, int (*<var>stream_func</var>) (void *<var>stream_data</var>, ucs4_t <var>uc</var>), void *<var>stream_data</var>)</i>
+<a name="IDX690"></a>
+</dt>
+<dd><p>Creates and returns a normalization filter for Unicode characters.
+</p>
+<p>The pair (<var>stream_func</var>, <var>stream_data</var>) is the encapsulated stream.
+<code><var>stream_func</var> (<var>stream_data</var>, <var>uc</var>)</code> receives the Unicode
+character <var>uc</var> and returns 0 if successful, or -1 with <code>errno</code> set
+upon failure.
+</p>
+<p>Returns the new filter, or NULL with <code>errno</code> set upon failure.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> int <b>uninorm_filter_write</b><i> (struct uninorm_filter *<var>filter</var>, ucs4_t <var>uc</var>)</i>
+<a name="IDX691"></a>
+</dt>
+<dd><p>Stuffs a Unicode character into a normalizing filter.
+Returns 0 if successful, or -1 with <code>errno</code> set upon failure.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> int <b>uninorm_filter_flush</b><i> (struct uninorm_filter *<var>filter</var>)</i>
+<a name="IDX692"></a>
+</dt>
+<dd><p>Brings data buffered in the filter to its destination, the encapsulated stream.
+</p>
+<p>Returns 0 if successful, or -1 with <code>errno</code> set upon failure.
+</p>
+<p>Note! If after calling this function, additional characters are written
+into the filter, the resulting character sequence in the encapsulated stream
+will not necessarily be normalized.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> int <b>uninorm_filter_free</b><i> (struct uninorm_filter *<var>filter</var>)</i>
+<a name="IDX693"></a>
+</dt>
+<dd><p>Brings data buffered in the filter to its destination, the encapsulated stream,
+then closes and frees the filter.
+</p>
+<p>Returns 0 if successful, or -1 with <code>errno</code> set upon failure.
+</p></dd></dl>
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC42" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_13.html#SEC48" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_13.html b/doc/libunistring_13.html
new file mode 100644
index 00000000..1597ec11
--- /dev/null
+++ b/doc/libunistring_13.html
@@ -0,0 +1,611 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: 13. Case mappings &lt;unicase.h&gt;</title>
+
+<meta name="description" content="GNU libunistring: 13. Case mappings &lt;unicase.h&gt;">
+<meta name="keywords" content="GNU libunistring: 13. Case mappings &lt;unicase.h&gt;">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_12.html#SEC42" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_14.html#SEC54" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="unicase_002eh"></a>
+<a name="SEC48"></a>
+<h1 class="chapter"> <a href="libunistring.html#TOC48">13. Case mappings <code>&lt;unicase.h&gt;</code></a> </h1>
+
+<p>This include file defines functions for case mapping for Unicode strings and
+case insensitive comparison of Unicode strings and C strings.
+</p>
+<p>These string functions fix the problems that were mentioned in
+<a href="libunistring_1.html#SEC6">&lsquo;<samp>char *</samp>&rsquo; strings</a>, namely, they handle the Croatian
+<small>LETTER DZ WITH CARON</small>, the German <small>LATIN SMALL LETTER SHARP S</small>, the
+Greek sigma and the Lithuanian i correctly.
+</p>
+
+<hr size="6">
+<a name="Case-mappings-of-characters"></a>
+<a name="SEC49"></a>
+<h2 class="section"> <a href="libunistring.html#TOC49">13.1 Case mappings of characters</a> </h2>
+
+<p>The following functions implement case mappings on Unicode characters &mdash;
+for those cases only where the result of the mapping is a again a single
+Unicode character.
+</p>
+<p>These mappings are locale and context independent.
+</p>
+<table class="cartouche" border="1"><tr><td>
+<p><strong>WARNING!</strong> These functions are not sufficient for languages such as
+German, Greek and Lithuanian. Better use the functions below that treat an
+entire string at once and are language aware.
+</p></td></tr></table>
+
+<dl>
+<dt><u>Function:</u> ucs4_t <b>uc_toupper</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX694"></a>
+</dt>
+<dd><p>Returns the uppercase mapping of the Unicode character <var>uc</var>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> ucs4_t <b>uc_tolower</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX695"></a>
+</dt>
+<dd><p>Returns the lowercase mapping of the Unicode character <var>uc</var>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> ucs4_t <b>uc_totitle</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX696"></a>
+</dt>
+<dd><p>Returns the titlecase mapping of the Unicode character <var>uc</var>.
+</p>
+<p>The titlecase mapping of a character is to be used when the character should
+look like upper case and the following characters are lower cased.
+</p>
+<p>For most characters, this is the same as the uppercase mapping. There are
+only few characters where the title case variant and the uuper case variant
+are different. These characters occur in the Latin writing of the Croatian,
+Bosnian, and Serbian languages.
+</p>
+<table>
+<thead><tr><th><p> Lower case </p></th><th><p> Title case </p></th><th><p> Upper case
+</p></th></tr></thead>
+<tr><td><p> LATIN SMALL LETTER LJ
+ </p></td><td><p> LATIN CAPITAL LETTER L WITH SMALL LETTER J
+ </p></td><td><p> LATIN CAPITAL LETTER LJ
+</p></td></tr>
+<tr><td><p> LATIN SMALL LETTER NJ
+ </p></td><td><p> LATIN CAPITAL LETTER N WITH SMALL LETTER J
+ </p></td><td><p> LATIN CAPITAL LETTER NJ
+</p></td></tr>
+<tr><td><p> LATIN SMALL LETTER DZ
+ </p></td><td><p> LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+ </p></td><td><p> LATIN CAPITAL LETTER DZ
+</p></td></tr>
+<tr><td><p> LATIN SMALL LETTER DZ WITH CARON
+ </p></td><td><p> LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+ </p></td><td><p> LATIN CAPITAL LETTER DZ WITH CARON
+</p></td></tr>
+</table>
+</dd></dl>
+
+<hr size="6">
+<a name="Case-mappings-of-strings"></a>
+<a name="SEC50"></a>
+<h2 class="section"> <a href="libunistring.html#TOC50">13.2 Case mappings of strings</a> </h2>
+
+<p>Case mapping should always be performed on entire strings, not on individual
+characters. The functions in this sections do so.
+</p>
+<p>These functions allow to apply a normalization after the case mapping. The
+reason is that if you want to treat &lsquo;<samp>&auml;</samp>&rsquo; and &lsquo;<samp>&Auml;</samp>&rsquo; the same,
+you most often also want to treat the composed and decomposed forms of such
+a character, U+00C4 <small>LATIN CAPITAL LETTER A WITH DIAERESIS</small> and
+U+0041 <small>LATIN CAPITAL LETTER A</small> U+0308 <small>COMBINING DIAERESIS</small> the same.
+The <var>nf</var> argument designates the normalization.
+</p>
+<a name="IDX697"></a>
+<p>These functions are locale dependent. The <var>iso639_language</var> argument
+identifies the language (e.g. <code>&quot;tr&quot;</code> for Turkish). NULL means to use
+locale independent case mappings.
+</p>
+<dl>
+<dt><u>Function:</u> const char * <b>uc_locale_language</b><i> ()</i>
+<a name="IDX698"></a>
+</dt>
+<dd><p>Returns the ISO 639 language code of the current locale.
+Returns <code>&quot;&quot;</code> if it is unknown, or in the &quot;C&quot; locale.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_toupper</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint8_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX699"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_toupper</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint16_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX700"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_toupper</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint32_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX701"></a>
+</dt>
+<dd><p>Returns the uppercase mapping of a string.
+</p>
+<p>The <var>nf</var> argument identifies the normalization form to apply after the
+case-mapping. It can also be NULL, for no normalization.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_tolower</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint8_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX702"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_tolower</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint16_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX703"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_tolower</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint32_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX704"></a>
+</dt>
+<dd><p>Returns the lowercase mapping of a string.
+</p>
+<p>The <var>nf</var> argument identifies the normalization form to apply after the
+case-mapping. It can also be NULL, for no normalization.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_totitle</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint8_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX705"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_totitle</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint16_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX706"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_totitle</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint32_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX707"></a>
+</dt>
+<dd><p>Returns the titlecase mapping of a string.
+</p>
+<p>Mapping to title case means that, in each word, the first cased character
+is being mapped to title case and the remaining characters of the word
+are being mapped to lower case.
+</p>
+<p>The <var>nf</var> argument identifies the normalization form to apply after the
+case-mapping. It can also be NULL, for no normalization.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Case-mappings-of-substrings"></a>
+<a name="SEC51"></a>
+<h2 class="section"> <a href="libunistring.html#TOC51">13.3 Case mappings of substrings</a> </h2>
+
+<p>Case mapping of a substring cannot simply be performed by extracting the
+substring and then applying the case mapping function to it. This does not
+work because case mapping requires some information about the surrounding
+characters. The following functions allow to apply case mappings to
+substrings of a given string, while taking into account the characters that
+precede it (the &ldquo;prefix&rdquo;) and the characters that follow it (the &ldquo;suffix&rdquo;).
+</p>
+<dl>
+<dt><u>Type:</u> <b>casing_prefix_context_t</b>
+<a name="IDX708"></a>
+</dt>
+<dd><p>This data type denotes the case-mapping context that is given by a prefix
+string. It is an immediate type that can be copied by simple assignment,
+without involving memory allocation. It is not an array type.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> casing_prefix_context_t <b>unicase_empty_prefix_context</b>
+<a name="IDX709"></a>
+</dt>
+<dd><p>This constant is the case-mapping context that corresponds to an empty prefix
+string.
+</p></dd></dl>
+
+<p>The following functions return <code>casing_prefix_context_t</code> objects:
+</p>
+<dl>
+<dt><u>Function:</u> casing_prefix_context_t <b>u8_casing_prefix_context</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX710"></a>
+</dt>
+<dt><u>Function:</u> casing_prefix_context_t <b>u16_casing_prefix_context</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX711"></a>
+</dt>
+<dt><u>Function:</u> casing_prefix_context_t <b>u32_casing_prefix_context</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX712"></a>
+</dt>
+<dd><p>Returns the case-mapping context of a given prefix string.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> casing_prefix_context_t <b>u8_casing_prefixes_context</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, casing_prefix_context_t <var>a_context</var>)</i>
+<a name="IDX713"></a>
+</dt>
+<dt><u>Function:</u> casing_prefix_context_t <b>u16_casing_prefixes_context</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, casing_prefix_context_t <var>a_context</var>)</i>
+<a name="IDX714"></a>
+</dt>
+<dt><u>Function:</u> casing_prefix_context_t <b>u32_casing_prefixes_context</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, casing_prefix_context_t <var>a_context</var>)</i>
+<a name="IDX715"></a>
+</dt>
+<dd><p>Returns the case-mapping context of the prefix concat(<var>a</var>, <var>s</var>),
+given the case-mapping context of the prefix <var>a</var>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Type:</u> <b>casing_suffix_context_t</b>
+<a name="IDX716"></a>
+</dt>
+<dd><p>This data type denotes the case-mapping context that is given by a suffix
+string. It is an immediate type that can be copied by simple assignment,
+without involving memory allocation. It is not an array type.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> casing_suffix_context_t <b>unicase_empty_suffix_context</b>
+<a name="IDX717"></a>
+</dt>
+<dd><p>This constant is the case-mapping context that corresponds to an empty suffix
+string.
+</p></dd></dl>
+
+<p>The following functions return <code>casing_suffix_context_t</code> objects:
+</p>
+<dl>
+<dt><u>Function:</u> casing_suffix_context_t <b>u8_casing_suffix_context</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX718"></a>
+</dt>
+<dt><u>Function:</u> casing_suffix_context_t <b>u16_casing_suffix_context</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX719"></a>
+</dt>
+<dt><u>Function:</u> casing_suffix_context_t <b>u32_casing_suffix_context</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX720"></a>
+</dt>
+<dd><p>Returns the case-mapping context of a given suffix string.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> casing_suffix_context_t <b>u8_casing_suffixes_context</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, casing_suffix_context_t <var>a_context</var>)</i>
+<a name="IDX721"></a>
+</dt>
+<dt><u>Function:</u> casing_suffix_context_t <b>u16_casing_suffixes_context</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, casing_suffix_context_t <var>a_context</var>)</i>
+<a name="IDX722"></a>
+</dt>
+<dt><u>Function:</u> casing_suffix_context_t <b>u32_casing_suffixes_context</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, casing_suffix_context_t <var>a_context</var>)</i>
+<a name="IDX723"></a>
+</dt>
+<dd><p>Returns the case-mapping context of the suffix concat(<var>s</var>, <var>a</var>),
+given the case-mapping context of the suffix <var>a</var>.
+</p></dd></dl>
+
+<p>The following functions perform a case mapping, considering the
+prefix context and the suffix context.
+</p>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_ct_toupper</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, casing_prefix_context_t <var>prefix_context</var>, casing_suffix_context_t <var>suffix_context</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint8_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX724"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_ct_toupper</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, casing_prefix_context_t <var>prefix_context</var>, casing_suffix_context_t <var>suffix_context</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint16_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX725"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_ct_toupper</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, casing_prefix_context_t <var>prefix_context</var>, casing_suffix_context_t <var>suffix_context</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint32_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX726"></a>
+</dt>
+<dd><p>Returns the uppercase mapping of a string that is surrounded by a prefix
+and a suffix.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_ct_tolower</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, casing_prefix_context_t <var>prefix_context</var>, casing_suffix_context_t <var>suffix_context</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint8_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX727"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_ct_tolower</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, casing_prefix_context_t <var>prefix_context</var>, casing_suffix_context_t <var>suffix_context</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint16_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX728"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_ct_tolower</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, casing_prefix_context_t <var>prefix_context</var>, casing_suffix_context_t <var>suffix_context</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint32_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX729"></a>
+</dt>
+<dd><p>Returns the lowercase mapping of a string that is surrounded by a prefix
+and a suffix.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_ct_totitle</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, casing_prefix_context_t <var>prefix_context</var>, casing_suffix_context_t <var>suffix_context</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint8_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX730"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_ct_totitle</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, casing_prefix_context_t <var>prefix_context</var>, casing_suffix_context_t <var>suffix_context</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint16_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX731"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_ct_totitle</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, casing_prefix_context_t <var>prefix_context</var>, casing_suffix_context_t <var>suffix_context</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint32_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX732"></a>
+</dt>
+<dd><p>Returns the titlecase mapping of a string that is surrounded by a prefix
+and a suffix.
+</p></dd></dl>
+
+<p>For example, to uppercase the UTF-8 substring between <code>s + start_index</code>
+and <code>s + end_index</code> of a string that extends from <code>s</code> to
+<code>s + u8_strlen (s)</code>, you can use the statements
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="smallexample">size_t result_length;
+uint8_t result =
+ u8_ct_toupper (s + start_index, end_index - start_index,
+ u8_casing_prefix_context (s, start_index),
+ u8_casing_suffix_context (s + end_index,
+ u8_strlen (s) - end_index),
+ iso639_language, NULL, NULL, &amp;result_length);
+</pre></td></tr></table>
+
+<hr size="6">
+<a name="Case-insensitive-comparison"></a>
+<a name="SEC52"></a>
+<h2 class="section"> <a href="libunistring.html#TOC52">13.4 Case insensitive comparison</a> </h2>
+
+<p>The following functions implement comparison that ignores differences in case
+and normalization.
+</p>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_casefold</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint8_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX733"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_casefold</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint16_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX734"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_casefold</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint32_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX735"></a>
+</dt>
+<dd><p>Returns the case folded string.
+</p>
+<p>Comparing <code>u8_casefold (<var>s1</var>)</code> and <code>u8_casefold (<var>s2</var>)</code>
+with the <code>u8_cmp2</code> function is equivalent to comparing <var>s1</var> and
+<var>s2</var> with <code>u8_casecmp</code>.
+</p>
+<p>The <var>nf</var> argument identifies the normalization form to apply after the
+case-mapping. It can also be NULL, for no normalization.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_ct_casefold</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, casing_prefix_context_t <var>prefix_context</var>, casing_suffix_context_t <var>suffix_context</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint8_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX736"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_ct_casefold</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, casing_prefix_context_t <var>prefix_context</var>, casing_suffix_context_t <var>suffix_context</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint16_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX737"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_ct_casefold</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, casing_prefix_context_t <var>prefix_context</var>, casing_suffix_context_t <var>suffix_context</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, uint32_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX738"></a>
+</dt>
+<dd><p>Returns the case folded string. The case folding takes into account the
+case mapping contexts of the prefix and suffix strings.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> int <b>u8_casecmp</b><i> (const uint8_t *<var>s1</var>, size_t <var>n1</var>, const uint8_t *<var>s2</var>, size_t <var>n2</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, int *<var>resultp</var>)</i>
+<a name="IDX739"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_casecmp</b><i> (const uint16_t *<var>s1</var>, size_t <var>n1</var>, const uint16_t *<var>s2</var>, size_t <var>n2</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, int *<var>resultp</var>)</i>
+<a name="IDX740"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_casecmp</b><i> (const uint32_t *<var>s1</var>, size_t <var>n1</var>, const uint32_t *<var>s2</var>, size_t <var>n2</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, int *<var>resultp</var>)</i>
+<a name="IDX741"></a>
+</dt>
+<dt><u>Function:</u> int <b>ulc_casecmp</b><i> (const char *<var>s1</var>, size_t <var>n1</var>, const char *<var>s2</var>, size_t <var>n2</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, int *<var>resultp</var>)</i>
+<a name="IDX742"></a>
+</dt>
+<dd><p>Compares <var>s1</var> and <var>s2</var>, ignoring differences in case and normalization.
+</p>
+<p>The <var>nf</var> argument identifies the normalization form to apply after the
+case-mapping. It can also be NULL, for no normalization.
+</p>
+<p>If successful, sets <code>*<var>resultp</var></code> to -1 if <var>s1</var> &lt; <var>s2</var>,
+0 if <var>s1</var> = <var>s2</var>, 1 if <var>s1</var> &gt; <var>s2</var>, and returns 0.
+Upon failure, returns -1 with <code>errno</code> set.
+</p></dd></dl>
+
+<a name="IDX743"></a>
+<a name="IDX744"></a>
+<a name="IDX745"></a>
+<a name="IDX746"></a>
+<p>The following functions additionally take into account the sorting rules of the
+current locale.
+</p>
+<dl>
+<dt><u>Function:</u> char * <b>u8_casexfrm</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, char *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX747"></a>
+</dt>
+<dt><u>Function:</u> char * <b>u16_casexfrm</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, char *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX748"></a>
+</dt>
+<dt><u>Function:</u> char * <b>u32_casexfrm</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, char *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX749"></a>
+</dt>
+<dt><u>Function:</u> char * <b>ulc_casexfrm</b><i> (const char *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, char *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX750"></a>
+</dt>
+<dd><p>Converts the string <var>s</var> of length <var>n</var> to a NUL-terminated byte
+sequence, in such a way that comparing <code>u8_casexfrm (<var>s1</var>)</code> and
+<code>u8_casexfrm (<var>s2</var>)</code> with the gnulib function <code>memcmp2</code> is
+equivalent to comparing <var>s1</var> and <var>s2</var> with <code>u8_casecoll</code>.
+</p>
+<p><var>nf</var> must be either <code>UNINORM_NFC</code>, <code>UNINORM_NFKC</code>, or NULL for
+no normalization.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> int <b>u8_casecoll</b><i> (const uint8_t *<var>s1</var>, size_t <var>n1</var>, const uint8_t *<var>s2</var>, size_t <var>n2</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, int *<var>resultp</var>)</i>
+<a name="IDX751"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_casecoll</b><i> (const uint16_t *<var>s1</var>, size_t <var>n1</var>, const uint16_t *<var>s2</var>, size_t <var>n2</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, int *<var>resultp</var>)</i>
+<a name="IDX752"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_casecoll</b><i> (const uint32_t *<var>s1</var>, size_t <var>n1</var>, const uint32_t *<var>s2</var>, size_t <var>n2</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, int *<var>resultp</var>)</i>
+<a name="IDX753"></a>
+</dt>
+<dt><u>Function:</u> int <b>ulc_casecoll</b><i> (const char *<var>s1</var>, size_t <var>n1</var>, const char *<var>s2</var>, size_t <var>n2</var>, const char *<var>iso639_language</var>, uninorm_t <var>nf</var>, int *<var>resultp</var>)</i>
+<a name="IDX754"></a>
+</dt>
+<dd><p>Compares <var>s1</var> and <var>s2</var>, ignoring differences in case and normalization,
+using the collation rules of the current locale.
+</p>
+<p>The <var>nf</var> argument identifies the normalization form to apply after the
+case-mapping. It must be either <code>UNINORM_NFC</code> or <code>UNINORM_NFKC</code>.
+It can also be NULL, for no normalization.
+</p>
+<p>If successful, sets <code>*<var>resultp</var></code> to -1 if <var>s1</var> &lt; <var>s2</var>,
+0 if <var>s1</var> = <var>s2</var>, 1 if <var>s1</var> &gt; <var>s2</var>, and returns 0.
+Upon failure, returns -1 with <code>errno</code> set.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Case-detection"></a>
+<a name="SEC53"></a>
+<h2 class="section"> <a href="libunistring.html#TOC53">13.5 Case detection</a> </h2>
+
+<p>The following functions determine whether a Unicode string is entirely in
+upper case. or entirely in lower case, or entirely in title case, or already
+case-folded.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>u8_is_uppercase</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, bool *<var>resultp</var>)</i>
+<a name="IDX755"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_is_uppercase</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, bool *<var>resultp</var>)</i>
+<a name="IDX756"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_is_uppercase</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, bool *<var>resultp</var>)</i>
+<a name="IDX757"></a>
+</dt>
+<dd><p>Sets <code>*<var>resultp</var></code> to true if mapping NFD(<var>s</var>) to upper case is
+a no-op, or to false otherwise, and returns 0. Upon failure, returns -1 with
+<code>errno</code> set.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> int <b>u8_is_lowercase</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, bool *<var>resultp</var>)</i>
+<a name="IDX758"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_is_lowercase</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, bool *<var>resultp</var>)</i>
+<a name="IDX759"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_is_lowercase</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, bool *<var>resultp</var>)</i>
+<a name="IDX760"></a>
+</dt>
+<dd><p>Sets <code>*<var>resultp</var></code> to true if mapping NFD(<var>s</var>) to lower case is
+a no-op, or to false otherwise, and returns 0. Upon failure, returns -1 with
+<code>errno</code> set.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> int <b>u8_is_titlecase</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, bool *<var>resultp</var>)</i>
+<a name="IDX761"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_is_titlecase</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, bool *<var>resultp</var>)</i>
+<a name="IDX762"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_is_titlecase</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, bool *<var>resultp</var>)</i>
+<a name="IDX763"></a>
+</dt>
+<dd><p>Sets <code>*<var>resultp</var></code> to true if mapping NFD(<var>s</var>) to title case is
+a no-op, or to false otherwise, and returns 0. Upon failure, returns -1 with
+<code>errno</code> set.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> int <b>u8_is_casefolded</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, bool *<var>resultp</var>)</i>
+<a name="IDX764"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_is_casefolded</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, bool *<var>resultp</var>)</i>
+<a name="IDX765"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_is_casefolded</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, bool *<var>resultp</var>)</i>
+<a name="IDX766"></a>
+</dt>
+<dd><p>Sets <code>*<var>resultp</var></code> to true if applying case folding to NFD(<var>S</var>) is
+a no-op, or to false otherwise, and returns 0. Upon failure, returns -1 with
+<code>errno</code> set.
+</p></dd></dl>
+
+<p>The following functions determine whether case mappings have any effect on a
+Unicode string.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>u8_is_cased</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, bool *<var>resultp</var>)</i>
+<a name="IDX767"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_is_cased</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, bool *<var>resultp</var>)</i>
+<a name="IDX768"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_is_cased</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, const char *<var>iso639_language</var>, bool *<var>resultp</var>)</i>
+<a name="IDX769"></a>
+</dt>
+<dd><p>Sets <code>*<var>resultp</var></code> to true if case matters for <var>s</var>, that is, if
+mapping NFD(<var>s</var>) to either upper case or lower case or title case is not
+a no-op. Set <code>*<var>resultp</var></code> to false if NFD(<var>s</var>) maps to itself
+under the upper case mapping, under the lower case mapping, and under the title
+case mapping; in other words, when NFD(<var>s</var>) consists entirely of caseless
+characters. Upon failure, returns -1 with <code>errno</code> set.
+</p></dd></dl>
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC48" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_14.html#SEC54" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_14.html b/doc/libunistring_14.html
new file mode 100644
index 00000000..f0b21257
--- /dev/null
+++ b/doc/libunistring_14.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: 14. Regular expressions &lt;uniregex.h&gt;</title>
+
+<meta name="description" content="GNU libunistring: 14. Regular expressions &lt;uniregex.h&gt;">
+<meta name="keywords" content="GNU libunistring: 14. Regular expressions &lt;uniregex.h&gt;">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_13.html#SEC48" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_15.html#SEC55" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="uniregex_002eh"></a>
+<a name="SEC54"></a>
+<h1 class="chapter"> <a href="libunistring.html#TOC54">14. Regular expressions <code>&lt;uniregex.h&gt;</code></a> </h1>
+
+<p>This include file is not yet implemented.
+</p>
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_13.html#SEC48" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_15.html#SEC55" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_15.html b/doc/libunistring_15.html
new file mode 100644
index 00000000..7c7ac329
--- /dev/null
+++ b/doc/libunistring_15.html
@@ -0,0 +1,232 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: 15. Using the library</title>
+
+<meta name="description" content="GNU libunistring: 15. Using the library">
+<meta name="keywords" content="GNU libunistring: 15. Using the library">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_14.html#SEC54" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_16.html#SEC61" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="Using-the-library"></a>
+<a name="SEC55"></a>
+<h1 class="chapter"> <a href="libunistring.html#TOC55">15. Using the library</a> </h1>
+
+<p>This chapter explains some practical considerations, regarding the
+installation and compiler options that are needed in order to use this
+library.
+</p>
+
+<hr size="6">
+<a name="Installation"></a>
+<a name="SEC56"></a>
+<h2 class="section"> <a href="libunistring.html#TOC56">15.1 Installation</a> </h2>
+
+<p>Before you can use the library, it must be installed. First, you have to
+make sure all dependencies are installed. They are listed in the file
+&lsquo;<tt>DEPENDENCIES</tt>&rsquo;.
+</p>
+<a name="IDX770"></a>
+<p>Then you can proceed to build and install the library, as described in the
+file &lsquo;<tt>INSTALL</tt>&rsquo;. For installation on Windows systems, please refer to
+the file &lsquo;<tt>README.woe32</tt>&rsquo;.
+</p>
+<hr size="6">
+<a name="Compiler-options"></a>
+<a name="SEC57"></a>
+<h2 class="section"> <a href="libunistring.html#TOC57">15.2 Compiler options</a> </h2>
+
+<p>Let's denote as <code>LIBUNISTRING_PREFIX</code> the value of the &lsquo;<samp>--prefix</samp>&rsquo;
+option that you passed to <code>configure</code> while installing this package.
+If you didn't pass any &lsquo;<samp>--prefix</samp>&rsquo; option, then the package is installed
+in &lsquo;<tt>/usr/local</tt>&rsquo;.
+</p>
+<p>Let's denote as <code>LIBUNISTRING_INCLUDEDIR</code> the directory where the
+include files were installed. This is usually the same as
+<code>${LIBUNISTRING_PREFIX}/include</code>. Except that if you passed an
+&lsquo;<samp>--includedir</samp>&rsquo; option to <code>configure</code>, it is the value of that
+option.
+</p>
+<p>Let's further denote as <code>LIBUNISTRING_LIBDIR</code> the directory where
+the library itself was installed. This is the value that you passed
+with the &lsquo;<samp>--libdir</samp>&rsquo; option to <code>configure</code>, or otherwise the
+same as <code>${LIBUNISTRING_PREFIX}/lib</code>. Recall that when building
+in 64-bit mode on a 64-bit GNU/Linux system that supports executables
+in either 64-bit mode or 32-bit mode, you should have used the option
+<code>--libdir=${LIBUNISTRING_PREFIX}/lib64</code>.
+</p>
+<a name="IDX771"></a>
+<p>So that the compiler finds the include files, you have to pass it the
+option <code>-I${LIBUNISTRING_INCLUDEDIR}</code>.
+</p>
+<p>So that the compiler finds the library during its linking pass, you have
+to pass it the options <code>-L${LIBUNISTRING_LIBDIR} -lunistring</code>.
+On some systems, in some configurations, you also have to pass options
+needed for linking with <code>libiconv</code>. The autoconf macro
+<code>gl_LIBUNISTRING</code> (see <a href="#SEC59">Autoconf macro</a>) deals with this
+particularity.
+</p>
+<hr size="6">
+<a name="Include-files"></a>
+<a name="SEC58"></a>
+<h2 class="section"> <a href="libunistring.html#TOC58">15.3 Include files</a> </h2>
+
+<p>Most of the include files have been presented in the introduction, see
+<a href="libunistring_1.html#SEC1">Introduction</a>, and subsequent detailed chapters.
+</p>
+<p>Another include file is <code>&lt;unistring/version.h&gt;</code>. It contains the
+version number of the libunistring library.
+</p>
+<dl>
+<dt><u>Macro:</u> int <b>_LIBUNISTRING_VERSION</b>
+<a name="IDX772"></a>
+</dt>
+<dd><p>This constant contains the version of libunistring that is being used
+at compile time. It encodes the major and minor parts of the version
+number only. These parts are encoded in the form <code>(major&lt;&lt;8) + minor</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>_libunistring_version</b>
+<a name="IDX773"></a>
+</dt>
+<dd><p>This constant contains the version of libunistring that is being used
+at run time. It encodes the major and minor parts of the version
+number only. These parts are encoded in the form <code>(major&lt;&lt;8) + minor</code>.
+</p></dd></dl>
+
+<p>It is possible that <code>_libunistring_version</code> is greater than
+<code>_LIBUNISTRING_VERSION</code>. This can happen when you use
+<code>libunistring</code> as a shared library, and a newer, binary
+backward-compatible version has been installed after your program
+that uses <code>libunistring</code> was installed.
+</p>
+<hr size="6">
+<a name="Autoconf-macro"></a>
+<a name="SEC59"></a>
+<h2 class="section"> <a href="libunistring.html#TOC59">15.4 Autoconf macro</a> </h2>
+
+<p>GNU Gnulib provides an autoconf macro that tests for the availability
+of <code>libunistring</code>. It is contained in the Gnulib module
+&lsquo;<samp>libunistring</samp>&rsquo;, see
+<a href="http://www.gnu.org/software/gnulib/MODULES.html#module=libunistring">http://www.gnu.org/software/gnulib/MODULES.html#module=libunistring</a>.
+</p>
+<a name="IDX774"></a>
+<p>The macro is called <code>gl_LIBUNISTRING</code>. It searches for an installed
+libunistring. If found, it sets and AC_SUBSTs <code>HAVE_LIBUNISTRING=yes</code>
+and the <code>LIBUNISTRING</code> and <code>LTLIBUNISTRING</code> variables and augments
+the <code>CPPFLAGS</code> variable, and defines the C macro
+<code>HAVE_LIBUNISTRING</code> to 1. Otherwise, it sets and AC_SUBSTs
+<code>HAVE_LIBUNISTRING=no</code> and <code>LIBUNISTRING</code> and <code>LTLIBUNISTRING</code>
+to empty.
+</p>
+<p>The complexities that <code>gl_LIBUNISTRING</code> deals with are the following:
+</p>
+<ul>
+<li>
+On some operating systems, in some configurations, libunistring depends
+on <code>libiconv</code>, and the options for linking with libiconv must be
+mentioned explicitly on the link command line.
+
+</li><li>
+GNU <code>libunistring</code>, if installed, is not necessarily already in the
+search path (<code>CPPFLAGS</code> for the include file search path,
+<code>LDFLAGS</code> for the library search path).
+
+</li><li>
+GNU <code>libunistring</code>, if installed, is not necessarily already in the
+run time library search path. To avoid the need for setting an environment
+variable like <code>LD_LIBRARY_PATH</code>, the macro adds the appropriate
+run time search path options to the <code>LIBUNISTRING</code> variable. This works
+on most systems.
+</li></ul>
+
+<hr size="6">
+<a name="Reporting-problems"></a>
+<a name="SEC60"></a>
+<h2 class="section"> <a href="libunistring.html#TOC60">15.5 Reporting problems</a> </h2>
+
+<p>If you encounter any problem, please don't hesitate to send a detailed
+bug report to the <code>bug-libunistring@gnu.org</code> mailing list. You can
+alternatively also use the bug tracker at the project page
+<a href="https://savannah.gnu.org/projects/libunistring">https://savannah.gnu.org/projects/libunistring</a>.
+</p>
+<p>Please always include the version number of this library, and a short
+description of your operating system and compilation environment with
+corresponding version numbers.
+</p>
+<p>For problems that appear while building and installing <code>libunistring</code>,
+for which you don't find the remedy in the &lsquo;<tt>INSTALL</tt>&rsquo; file, please include
+a description of the options that you passed to the &lsquo;<samp>configure</samp>&rsquo; script.
+</p>
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC55" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_16.html#SEC61" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_16.html b/doc/libunistring_16.html
new file mode 100644
index 00000000..bfe61265
--- /dev/null
+++ b/doc/libunistring_16.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: 16. More advanced functionality</title>
+
+<meta name="description" content="GNU libunistring: 16. More advanced functionality">
+<meta name="keywords" content="GNU libunistring: 16. More advanced functionality">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_15.html#SEC55" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_17.html#SEC62" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="More-functionality"></a>
+<a name="SEC61"></a>
+<h1 class="chapter"> <a href="libunistring.html#TOC61">16. More advanced functionality</a> </h1>
+
+<p>For bidirectional reordering of strings, we recommend the GNU FriBidi library:
+<a href="http://www.fribidi.org/">http://www.fribidi.org/</a>.
+</p>
+<a name="IDX775"></a>
+<p>For the rendering of Unicode strings outside of the context of a given toolkit
+(KDE/Qt or GNOME/Gtk), we recommend the Pango library:
+<a href="http://www.pango.org/">http://www.pango.org/</a>.
+</p>
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_15.html#SEC55" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_17.html#SEC62" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_17.html b/doc/libunistring_17.html
new file mode 100644
index 00000000..73ade2f2
--- /dev/null
+++ b/doc/libunistring_17.html
@@ -0,0 +1,1526 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: A. Licenses</title>
+
+<meta name="description" content="GNU libunistring: A. Licenses">
+<meta name="keywords" content="GNU libunistring: A. Licenses">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_16.html#SEC61" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="Licenses"></a>
+<a name="SEC62"></a>
+<h1 class="appendix"> <a href="libunistring.html#TOC62">A. Licenses</a> </h1>
+
+<p>The files of this package are covered by the licenses indicated in each
+particular file or directory. Here is a summary:
+</p>
+<ul>
+<li>
+The <code>libunistring</code> library is covered by the
+GNU Lesser General Public License (LGPL).
+A copy of the license is included in <a href="#SEC68">GNU LESSER GENERAL PUBLIC LICENSE</a>.
+
+</li><li>
+This manual is free documentation. It is dually licensed under the
+GNU FDL and the GNU GPL. This means that you can redistribute this
+manual under either of these two licenses, at your choice.
+<br>
+This manual is covered by the GNU FDL. Permission is granted to copy,
+distribute and/or modify this document under the terms of the
+GNU Free Documentation License (FDL), either version 1.2 of the
+License, or (at your option) any later version published by the
+Free Software Foundation (FSF); with no Invariant Sections, with no
+Front-Cover Text, and with no Back-Cover Texts.
+A copy of the license is included in <a href="#SEC69">GNU Free Documentation License</a>.
+<br>
+This manual is covered by the GNU GPL. You can redistribute it and/or
+modify it under the terms of the GNU General Public License (GPL), either
+version 3 of the License, or (at your option) any later version published
+by the Free Software Foundation (FSF).
+A copy of the license is included in <a href="#SEC63">GNU GENERAL PUBLIC LICENSE</a>.
+</li></ul>
+
+
+
+<hr size="6">
+<a name="GNU-GPL"></a>
+<a name="SEC63"></a>
+<h2 class="appendixsec"> <a href="libunistring.html#TOC63">A.1 GNU GENERAL PUBLIC LICENSE</a> </h2>
+<p align="center"> Version 3, 29 June 2007
+</p>
+
+<table><tr><td>&nbsp;</td><td><pre class="display">Copyright &copy; 2007 Free Software Foundation, Inc. <a href="http://fsf.org/">http://fsf.org/</a>
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+</pre></td></tr></table>
+
+<a name="SEC64"></a>
+<h2 class="heading"> Preamble </h2>
+
+<p>The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+</p>
+<p>The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom
+to share and change all versions of a program&mdash;to make sure it remains
+free software for all its users. We, the Free Software Foundation,
+use the GNU General Public License for most of our software; it
+applies also to any other work released this way by its authors. You
+can apply it to your programs, too.
+</p>
+<p>When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+</p>
+<p>To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you
+have certain responsibilities if you distribute copies of the
+software, or if you modify it: responsibilities to respect the freedom
+of others.
+</p>
+<p>For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too,
+receive or can get the source code. And you must show them these
+terms so they know their rights.
+</p>
+<p>Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+</p>
+<p>For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+</p>
+<p>Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the
+manufacturer can do so. This is fundamentally incompatible with the
+aim of protecting users' freedom to change the software. The
+systematic pattern of such abuse occurs in the area of products for
+individuals to use, which is precisely where it is most unacceptable.
+Therefore, we have designed this version of the GPL to prohibit the
+practice for those products. If such problems arise substantially in
+other domains, we stand ready to extend this provision to those
+domains in future versions of the GPL, as needed to protect the
+freedom of users.
+</p>
+<p>Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish
+to avoid the special danger that patents applied to a free program
+could make it effectively proprietary. To prevent this, the GPL
+assures that patents cannot be used to render the program non-free.
+</p>
+<p>The precise terms and conditions for copying, distribution and
+modification follow.
+</p>
+<a name="SEC65"></a>
+<h2 class="heading"> TERMS AND CONDITIONS </h2>
+
+<ol>
+<li> Definitions.
+
+<p>&ldquo;This License&rdquo; refers to version 3 of the GNU General Public License.
+</p>
+<p>&ldquo;Copyright&rdquo; also means copyright-like laws that apply to other kinds
+of works, such as semiconductor masks.
+</p>
+<p>&ldquo;The Program&rdquo; refers to any copyrightable work licensed under this
+License. Each licensee is addressed as &ldquo;you&rdquo;. &ldquo;Licensees&rdquo; and
+&ldquo;recipients&rdquo; may be individuals or organizations.
+</p>
+<p>To &ldquo;modify&rdquo; a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of
+an exact copy. The resulting work is called a &ldquo;modified version&rdquo; of
+the earlier work or a work &ldquo;based on&rdquo; the earlier work.
+</p>
+<p>A &ldquo;covered work&rdquo; means either the unmodified Program or a work based
+on the Program.
+</p>
+<p>To &ldquo;propagate&rdquo; a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+</p>
+<p>To &ldquo;convey&rdquo; a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user
+through a computer network, with no transfer of a copy, is not
+conveying.
+</p>
+<p>An interactive user interface displays &ldquo;Appropriate Legal Notices&rdquo; to
+the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+</p>
+</li><li> Source Code.
+
+<p>The &ldquo;source code&rdquo; for a work means the preferred form of the work for
+making modifications to it. &ldquo;Object code&rdquo; means any non-source form
+of a work.
+</p>
+<p>A &ldquo;Standard Interface&rdquo; means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+</p>
+<p>The &ldquo;System Libraries&rdquo; of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+&ldquo;Major Component&rdquo;, in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+</p>
+<p>The &ldquo;Corresponding Source&rdquo; for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+</p>
+<p>The Corresponding Source need not include anything that users can
+regenerate automatically from other parts of the Corresponding Source.
+</p>
+<p>The Corresponding Source for a work in source code form is that same
+work.
+</p>
+</li><li> Basic Permissions.
+
+<p>All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+</p>
+<p>You may make, run and propagate covered works that you do not convey,
+without conditions so long as your license otherwise remains in force.
+You may convey covered works to others for the sole purpose of having
+them make modifications exclusively for you, or provide you with
+facilities for running those works, provided that you comply with the
+terms of this License in conveying all material for which you do not
+control copyright. Those thus making or running the covered works for
+you must do so exclusively on your behalf, under your direction and
+control, on terms that prohibit them from making any copies of your
+copyrighted material outside their relationship with you.
+</p>
+<p>Conveying under any other circumstances is permitted solely under the
+conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+</p>
+</li><li> Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+<p>No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+</p>
+<p>When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such
+circumvention is effected by exercising rights under this License with
+respect to the covered work, and you disclaim any intention to limit
+operation or modification of the work as a means of enforcing, against
+the work's users, your or third parties' legal rights to forbid
+circumvention of technological measures.
+</p>
+</li><li> Conveying Verbatim Copies.
+
+<p>You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+</p>
+<p>You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+</p>
+</li><li> Conveying Modified Source Versions.
+
+<p>You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these
+conditions:
+</p>
+<ol>
+<li>
+The work must carry prominent notices stating that you modified it,
+and giving a relevant date.
+
+</li><li>
+The work must carry prominent notices stating that it is released
+under this License and any conditions added under section 7. This
+requirement modifies the requirement in section 4 to &ldquo;keep intact all
+notices&rdquo;.
+
+</li><li>
+You must license the entire work, as a whole, under this License to
+anyone who comes into possession of a copy. This License will
+therefore apply, along with any applicable section 7 additional terms,
+to the whole of the work, and all its parts, regardless of how they
+are packaged. This License gives no permission to license the work in
+any other way, but it does not invalidate such permission if you have
+separately received it.
+
+</li><li>
+If the work has interactive user interfaces, each must display
+Appropriate Legal Notices; however, if the Program has interactive
+interfaces that do not display Appropriate Legal Notices, your work
+need not make them do so.
+</li></ol>
+
+<p>A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+&ldquo;aggregate&rdquo; if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+</p>
+</li><li> Conveying Non-Source Forms.
+
+<p>You may convey a covered work in object code form under the terms of
+sections 4 and 5, provided that you also convey the machine-readable
+Corresponding Source under the terms of this License, in one of these
+ways:
+</p>
+<ol>
+<li>
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by the
+Corresponding Source fixed on a durable physical medium customarily
+used for software interchange.
+
+</li><li>
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by a written
+offer, valid for at least three years and valid for as long as you
+offer spare parts or customer support for that product model, to give
+anyone who possesses the object code either (1) a copy of the
+Corresponding Source for all the software in the product that is
+covered by this License, on a durable physical medium customarily used
+for software interchange, for a price no more than your reasonable
+cost of physically performing this conveying of source, or (2) access
+to copy the Corresponding Source from a network server at no charge.
+
+</li><li>
+Convey individual copies of the object code with a copy of the written
+offer to provide the Corresponding Source. This alternative is
+allowed only occasionally and noncommercially, and only if you
+received the object code with such an offer, in accord with subsection
+6b.
+
+</li><li>
+Convey the object code by offering access from a designated place
+(gratis or for a charge), and offer equivalent access to the
+Corresponding Source in the same way through the same place at no
+further charge. You need not require recipients to copy the
+Corresponding Source along with the object code. If the place to copy
+the object code is a network server, the Corresponding Source may be
+on a different server (operated by you or a third party) that supports
+equivalent copying facilities, provided you maintain clear directions
+next to the object code saying where to find the Corresponding Source.
+Regardless of what server hosts the Corresponding Source, you remain
+obligated to ensure that it is available for as long as needed to
+satisfy these requirements.
+
+</li><li>
+Convey the object code using peer-to-peer transmission, provided you
+inform other peers where the object code and Corresponding Source of
+the work are being offered to the general public at no charge under
+subsection 6d.
+
+</li></ol>
+
+<p>A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+</p>
+<p>A &ldquo;User Product&rdquo; is either (1) a &ldquo;consumer product&rdquo;, which means any
+tangible personal property which is normally used for personal,
+family, or household purposes, or (2) anything designed or sold for
+incorporation into a dwelling. In determining whether a product is a
+consumer product, doubtful cases shall be resolved in favor of
+coverage. For a particular product received by a particular user,
+&ldquo;normally used&rdquo; refers to a typical or common use of that class of
+product, regardless of the status of the particular user or of the way
+in which the particular user actually uses, or expects or is expected
+to use, the product. A product is a consumer product regardless of
+whether the product has substantial commercial, industrial or
+non-consumer uses, unless such uses represent the only significant
+mode of use of the product.
+</p>
+<p>&ldquo;Installation Information&rdquo; for a User Product means any methods,
+procedures, authorization keys, or other information required to
+install and execute modified versions of a covered work in that User
+Product from a modified version of its Corresponding Source. The
+information must suffice to ensure that the continued functioning of
+the modified object code is in no case prevented or interfered with
+solely because modification has been made.
+</p>
+<p>If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+</p>
+<p>The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or
+updates for a work that has been modified or installed by the
+recipient, or for the User Product in which it has been modified or
+installed. Access to a network may be denied when the modification
+itself materially and adversely affects the operation of the network
+or violates the rules and protocols for communication across the
+network.
+</p>
+<p>Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+</p>
+</li><li> Additional Terms.
+
+<p>&ldquo;Additional permissions&rdquo; are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+</p>
+<p>When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+</p>
+<p>Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders
+of that material) supplement the terms of this License with terms:
+</p>
+<ol>
+<li>
+Disclaiming warranty or limiting liability differently from the terms
+of sections 15 and 16 of this License; or
+
+</li><li>
+Requiring preservation of specified reasonable legal notices or author
+attributions in that material or in the Appropriate Legal Notices
+displayed by works containing it; or
+
+</li><li>
+Prohibiting misrepresentation of the origin of that material, or
+requiring that modified versions of such material be marked in
+reasonable ways as different from the original version; or
+
+</li><li>
+Limiting the use for publicity purposes of names of licensors or
+authors of the material; or
+
+</li><li>
+Declining to grant rights under trademark law for use of some trade
+names, trademarks, or service marks; or
+
+</li><li>
+Requiring indemnification of licensors and authors of that material by
+anyone who conveys the material (or modified versions of it) with
+contractual assumptions of liability to the recipient, for any
+liability that these contractual assumptions directly impose on those
+licensors and authors.
+</li></ol>
+
+<p>All other non-permissive additional terms are considered &ldquo;further
+restrictions&rdquo; within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+</p>
+<p>If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+</p>
+<p>Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions; the
+above requirements apply either way.
+</p>
+</li><li> Termination.
+
+<p>You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+</p>
+<p>However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+</p>
+<p>Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+</p>
+<p>Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+</p>
+</li><li> Acceptance Not Required for Having Copies.
+
+<p>You are not required to accept this License in order to receive or run
+a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+</p>
+</li><li> Automatic Licensing of Downstream Recipients.
+
+<p>Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+</p>
+<p>An &ldquo;entity transaction&rdquo; is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+</p>
+<p>You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+</p>
+</li><li> Patents.
+
+<p>A &ldquo;contributor&rdquo; is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's &ldquo;contributor version&rdquo;.
+</p>
+<p>A contributor's &ldquo;essential patent claims&rdquo; are all patent claims owned
+or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, &ldquo;control&rdquo; includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+</p>
+<p>Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+</p>
+<p>In the following three paragraphs, a &ldquo;patent license&rdquo; is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To &ldquo;grant&rdquo; such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+</p>
+<p>If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. &ldquo;Knowingly relying&rdquo; means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+</p>
+<p>If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+</p>
+<p>A patent license is &ldquo;discriminatory&rdquo; if it does not include within the
+scope of its coverage, prohibits the exercise of, or is conditioned on
+the non-exercise of one or more of the rights that are specifically
+granted under this License. You may not convey a covered work if you
+are a party to an arrangement with a third party that is in the
+business of distributing software, under which you make payment to the
+third party based on the extent of your activity of conveying the
+work, and under which the third party grants, to any of the parties
+who would receive the covered work from you, a discriminatory patent
+license (a) in connection with copies of the covered work conveyed by
+you (or copies made from those copies), or (b) primarily for and in
+connection with specific products or compilations that contain the
+covered work, unless you entered into that arrangement, or that patent
+license was granted, prior to 28 March 2007.
+</p>
+<p>Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+</p>
+</li><li> No Surrender of Others' Freedom.
+
+<p>If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey
+a covered work so as to satisfy simultaneously your obligations under
+this License and any other pertinent obligations, then as a
+consequence you may not convey it at all. For example, if you agree
+to terms that obligate you to collect a royalty for further conveying
+from those to whom you convey the Program, the only way you could
+satisfy both those terms and this License would be to refrain entirely
+from conveying the Program.
+</p>
+</li><li> Use with the GNU Affero General Public License.
+
+<p>Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+</p>
+</li><li> Revised Versions of this License.
+
+<p>The Free Software Foundation may publish revised and/or new versions
+of the GNU General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+</p>
+<p>Each version is given a distinguishing version number. If the Program
+specifies that a certain numbered version of the GNU General Public
+License &ldquo;or any later version&rdquo; applies to it, you have the option of
+following the terms and conditions either of that numbered version or
+of any later version published by the Free Software Foundation. If
+the Program does not specify a version number of the GNU General
+Public License, you may choose any version ever published by the Free
+Software Foundation.
+</p>
+<p>If the Program specifies that a proxy can decide which future versions
+of the GNU General Public License can be used, that proxy's public
+statement of acceptance of a version permanently authorizes you to
+choose that version for the Program.
+</p>
+<p>Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+</p>
+</li><li> Disclaimer of Warranty.
+
+<p>THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM &ldquo;AS IS&rdquo; WITHOUT
+WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.
+</p>
+</li><li> Limitation of Liability.
+
+<p>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
+CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT
+NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
+LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM
+TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
+PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+</p>
+</li><li> Interpretation of Sections 15 and 16.
+
+<p>If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+</p>
+</li></ol>
+
+<a name="SEC66"></a>
+<h2 class="heading"> END OF TERMS AND CONDITIONS </h2>
+
+<a name="SEC67"></a>
+<h2 class="heading"> How to Apply These Terms to Your New Programs </h2>
+
+<p>If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+</p>
+<p>To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the &ldquo;copyright&rdquo; line and a pointer to where the full notice is found.
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="smallexample"><var>one line to give the program's name and a brief idea of what it does.</var>
+Copyright (C) <var>year</var> <var>name of author</var>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</pre></td></tr></table>
+
+<p>Also add information on how to contact you by electronic and paper mail.
+</p>
+<p>If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="smallexample"><var>program</var> Copyright (C) <var>year</var> <var>name of author</var>
+This program comes with ABSOLUTELY NO WARRANTY; for details type &lsquo;<samp>show w</samp>&rsquo;.
+This is free software, and you are welcome to redistribute it
+under certain conditions; type &lsquo;<samp>show c</samp>&rsquo; for details.
+</pre></td></tr></table>
+
+<p>The hypothetical commands &lsquo;<samp>show w</samp>&rsquo; and &lsquo;<samp>show c</samp>&rsquo; should show
+the appropriate parts of the General Public License. Of course, your
+program's commands might be different; for a GUI interface, you would
+use an &ldquo;about box&rdquo;.
+</p>
+<p>You should also get your employer (if you work as a programmer) or school,
+if any, to sign a &ldquo;copyright disclaimer&rdquo; for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p>
+<p>The GNU General Public License does not permit incorporating your
+program into proprietary programs. If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library. If this is what you want to do, use
+the GNU Lesser General Public License instead of this License. But
+first, please read <a href="http://www.gnu.org/philosophy/why-not-lgpl.html">http://www.gnu.org/philosophy/why-not-lgpl.html</a>.
+
+</p><hr size="6">
+<a name="GNU-LGPL"></a>
+<a name="SEC68"></a>
+<h2 class="appendixsec"> <a href="libunistring.html#TOC64">A.2 GNU LESSER GENERAL PUBLIC LICENSE</a> </h2>
+<p align="center"> Version 3, 29 June 2007
+</p>
+
+<table><tr><td>&nbsp;</td><td><pre class="display">Copyright &copy; 2007 Free Software Foundation, Inc. <a href="http://fsf.org/">http://fsf.org/</a>
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+</pre></td></tr></table>
+
+<p>This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+</p>
+<ol>
+<li> Additional Definitions.
+
+<p>As used herein, &ldquo;this License&rdquo; refers to version 3 of the GNU Lesser
+General Public License, and the &ldquo;GNU GPL&rdquo; refers to version 3 of the GNU
+General Public License.
+</p>
+<p>&ldquo;The Library&rdquo; refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+</p>
+<p>An &ldquo;Application&rdquo; is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+</p>
+<p>A &ldquo;Combined Work&rdquo; is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the &ldquo;Linked
+Version&rdquo;.
+</p>
+<p>The &ldquo;Minimal Corresponding Source&rdquo; for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+</p>
+<p>The &ldquo;Corresponding Application Code&rdquo; for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+</p>
+</li><li> Exception to Section 3 of the GNU GPL.
+
+<p>You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+</p>
+</li><li> Conveying Modified Versions.
+
+<p>If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+</p>
+<ol>
+<li>
+under this License, provided that you make a good faith effort to
+ensure that, in the event an Application does not supply the
+function or data, the facility still operates, and performs
+whatever part of its purpose remains meaningful, or
+
+</li><li>
+under the GNU GPL, with none of the additional permissions of
+this License applicable to that copy.
+</li></ol>
+
+</li><li> Object Code Incorporating Material from Library Header Files.
+
+<p>The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+</p>
+<ol>
+<li>
+Give prominent notice with each copy of the object code that the
+Library is used in it and that the Library and its use are
+covered by this License.
+</li><li>
+Accompany the object code with a copy of the GNU GPL and this license
+document.
+</li></ol>
+
+</li><li> Combined Works.
+
+<p>You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+</p>
+<ol>
+<li>
+Give prominent notice with each copy of the Combined Work that
+the Library is used in it and that the Library and its use are
+covered by this License.
+</li><li>
+Accompany the Combined Work with a copy of the GNU GPL and this license
+document.
+</li><li>
+For a Combined Work that displays copyright notices during
+execution, include the copyright notice for the Library among
+these notices, as well as a reference directing the user to the
+copies of the GNU GPL and this license document.
+</li><li>
+Do one of the following:
+
+<ol>
+<li>
+Convey the Minimal Corresponding Source under the terms of this
+License, and the Corresponding Application Code in a form
+suitable for, and under terms that permit, the user to
+recombine or relink the Application with a modified version of
+the Linked Version to produce a modified Combined Work, in the
+manner specified by section 6 of the GNU GPL for conveying
+Corresponding Source.
+</li><li>
+Use a suitable shared library mechanism for linking with the
+Library. A suitable mechanism is one that (a) uses at run time
+a copy of the Library already present on the user's computer
+system, and (b) will operate properly with a modified version
+of the Library that is interface-compatible with the Linked
+Version.
+</li></ol>
+
+</li><li>
+Provide Installation Information, but only if you would otherwise
+be required to provide such information under section 6 of the
+GNU GPL, and only to the extent that such information is
+necessary to install and execute a modified version of the
+Combined Work produced by recombining or relinking the
+Application with a modified version of the Linked Version. (If
+you use option 4d0, the Installation Information must accompany
+the Minimal Corresponding Source and Corresponding Application
+Code. If you use option 4d1, you must provide the Installation
+Information in the manner specified by section 6 of the GNU GPL
+for conveying Corresponding Source.)
+</li></ol>
+
+</li><li> Combined Libraries.
+
+<p>You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+</p>
+<ol>
+<li>
+Accompany the combined library with a copy of the same work based
+on the Library, uncombined with any other library facilities,
+conveyed under the terms of this License.
+</li><li>
+Give prominent notice with the combined library that part of it
+is a work based on the Library, and explaining where to find the
+accompanying uncombined form of the same work.
+</li></ol>
+
+</li><li> Revised Versions of the GNU Lesser General Public License.
+
+<p>The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+</p>
+<p>Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License &ldquo;or any later version&rdquo;
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+</p>
+<p>If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+</p>
+</li></ol>
+
+<hr size="6">
+<a name="GNU-FDL"></a>
+<a name="SEC69"></a>
+<h2 class="appendixsec"> <a href="libunistring.html#TOC65">A.3 GNU Free Documentation License</a> </h2>
+<p align="center"> Version 1.3, 3 November 2008
+</p>
+
+<table><tr><td>&nbsp;</td><td><pre class="display">Copyright &copy; 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+<a href="http://fsf.org/">http://fsf.org/</a>
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</pre></td></tr></table>
+
+<ol>
+<li>
+PREAMBLE
+
+<p>The purpose of this License is to make a manual, textbook, or other
+functional and useful document <em>free</em> in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+</p>
+<p>This License is a kind of &ldquo;copyleft&rdquo;, which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+</p>
+<p>We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+</p>
+</li><li>
+APPLICABILITY AND DEFINITIONS
+
+<p>This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The &ldquo;Document&rdquo;, below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as &ldquo;you&rdquo;. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+</p>
+<p>A &ldquo;Modified Version&rdquo; of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+</p>
+<p>A &ldquo;Secondary Section&rdquo; is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject. (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+</p>
+<p>The &ldquo;Invariant Sections&rdquo; are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+</p>
+<p>The &ldquo;Cover Texts&rdquo; are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+</p>
+<p>A &ldquo;Transparent&rdquo; copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not &ldquo;Transparent&rdquo; is called &ldquo;Opaque&rdquo;.
+</p>
+<p>Examples of suitable formats for Transparent copies include plain
+<small>ASCII</small> without markup, Texinfo input format, LaTeX input
+format, <acronym>SGML</acronym> or <acronym>XML</acronym> using a publicly available
+<acronym>DTD</acronym>, and standard-conforming simple <acronym>HTML</acronym>,
+PostScript or <acronym>PDF</acronym> designed for human modification. Examples
+of transparent image formats include <acronym>PNG</acronym>, <acronym>XCF</acronym> and
+<acronym>JPG</acronym>. Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, <acronym>SGML</acronym> or
+<acronym>XML</acronym> for which the <acronym>DTD</acronym> and/or processing tools are
+not generally available, and the machine-generated <acronym>HTML</acronym>,
+PostScript or <acronym>PDF</acronym> produced by some word processors for
+output purposes only.
+</p>
+<p>The &ldquo;Title Page&rdquo; means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, &ldquo;Title Page&rdquo; means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+</p>
+<p>The &ldquo;publisher&rdquo; means any person or entity that distributes copies
+of the Document to the public.
+</p>
+<p>A section &ldquo;Entitled XYZ&rdquo; means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as &ldquo;Acknowledgements&rdquo;,
+&ldquo;Dedications&rdquo;, &ldquo;Endorsements&rdquo;, or &ldquo;History&rdquo;.) To &ldquo;Preserve the Title&rdquo;
+of such a section when you modify the Document means that it remains a
+section &ldquo;Entitled XYZ&rdquo; according to this definition.
+</p>
+<p>The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+</p>
+</li><li>
+VERBATIM COPYING
+
+<p>You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+</p>
+<p>You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+</p>
+</li><li>
+COPYING IN QUANTITY
+
+<p>If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+</p>
+<p>If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+</p>
+<p>If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+</p>
+<p>It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+</p>
+</li><li>
+MODIFICATIONS
+
+<p>You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+</p>
+<ol>
+<li>
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document). You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+</li><li>
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+</li><li>
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+</li><li>
+Preserve all the copyright notices of the Document.
+
+</li><li>
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+</li><li>
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+</li><li>
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+</li><li>
+Include an unaltered copy of this License.
+
+</li><li>
+Preserve the section Entitled &ldquo;History&rdquo;, Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page. If
+there is no section Entitled &ldquo;History&rdquo; in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+</li><li>
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on. These may be placed in the &ldquo;History&rdquo; section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+</li><li>
+For any section Entitled &ldquo;Acknowledgements&rdquo; or &ldquo;Dedications&rdquo;, Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+</li><li>
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles. Section numbers
+or the equivalent are not considered part of the section titles.
+
+</li><li>
+Delete any section Entitled &ldquo;Endorsements&rdquo;. Such a section
+may not be included in the Modified Version.
+
+</li><li>
+Do not retitle any existing section to be Entitled &ldquo;Endorsements&rdquo; or
+to conflict in title with any Invariant Section.
+
+</li><li>
+Preserve any Warranty Disclaimers.
+</li></ol>
+
+<p>If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+</p>
+<p>You may add a section Entitled &ldquo;Endorsements&rdquo;, provided it contains
+nothing but endorsements of your Modified Version by various
+parties&mdash;for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+</p>
+<p>You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+</p>
+<p>The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+</p>
+</li><li>
+COMBINING DOCUMENTS
+
+<p>You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+</p>
+<p>The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+</p>
+<p>In the combination, you must combine any sections Entitled &ldquo;History&rdquo;
+in the various original documents, forming one section Entitled
+&ldquo;History&rdquo;; likewise combine any sections Entitled &ldquo;Acknowledgements&rdquo;,
+and any sections Entitled &ldquo;Dedications&rdquo;. You must delete all
+sections Entitled &ldquo;Endorsements.&rdquo;
+</p>
+</li><li>
+COLLECTIONS OF DOCUMENTS
+
+<p>You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+</p>
+<p>You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+</p>
+</li><li>
+AGGREGATION WITH INDEPENDENT WORKS
+
+<p>A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an &ldquo;aggregate&rdquo; if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+</p>
+<p>If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+</p>
+</li><li>
+TRANSLATION
+
+<p>Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+</p>
+<p>If a section in the Document is Entitled &ldquo;Acknowledgements&rdquo;,
+&ldquo;Dedications&rdquo;, or &ldquo;History&rdquo;, the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+</p>
+</li><li>
+TERMINATION
+
+<p>You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+</p>
+<p>However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+</p>
+<p>Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+</p>
+<p>Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+</p>
+</li><li>
+FUTURE REVISIONS OF THIS LICENSE
+
+<p>The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+<a href="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</a>.
+</p>
+<p>Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License &ldquo;or any later version&rdquo; applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation. If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+</p>
+</li><li>
+RELICENSING
+
+<p>&ldquo;Massive Multiauthor Collaboration Site&rdquo; (or &ldquo;MMC Site&rdquo;) means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server. A
+&ldquo;Massive Multiauthor Collaboration&rdquo; (or &ldquo;MMC&rdquo;) contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+</p>
+<p>&ldquo;CC-BY-SA&rdquo; means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+</p>
+<p>&ldquo;Incorporate&rdquo; means to publish or republish a Document, in whole or
+in part, as part of another Document.
+</p>
+<p>An MMC is &ldquo;eligible for relicensing&rdquo; if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+</p>
+<p>The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+</p>
+</li></ol>
+
+
+<a name="SEC70"></a>
+<h2 class="heading"> ADDENDUM: How to use this License for your documents </h2>
+
+<p>To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="smallexample"> Copyright (C) <var>year</var> <var>your name</var>.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+</pre></td></tr></table>
+
+<p>If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the &ldquo;with&hellip;Texts.&rdquo; line with this:
+</p>
+<table><tr><td>&nbsp;</td><td><pre class="smallexample"> with the Invariant Sections being <var>list their titles</var>, with
+ the Front-Cover Texts being <var>list</var>, and with the Back-Cover Texts
+ being <var>list</var>.
+</pre></td></tr></table>
+
+<p>If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+</p>
+<p>If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+</p>
+
+
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC62" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_18.html b/doc/libunistring_18.html
new file mode 100644
index 00000000..8237bf6a
--- /dev/null
+++ b/doc/libunistring_18.html
@@ -0,0 +1,770 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: Index</title>
+
+<meta name="description" content="GNU libunistring: Index">
+<meta name="keywords" content="GNU libunistring: Index">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_17.html#SEC62" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_19.html#INDEX0" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="Index"></a>
+<a name="SEC71"></a>
+<h1 class="unnumbered"> <a href="libunistring.html#TOC66">Index</a> </h1>
+
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#SEC71_0" class="summary-letter"><b>A</b></a>
+ &nbsp;
+<a href="#SEC71_1" class="summary-letter"><b>B</b></a>
+ &nbsp;
+<a href="#SEC71_2" class="summary-letter"><b>C</b></a>
+ &nbsp;
+<a href="#SEC71_3" class="summary-letter"><b>D</b></a>
+ &nbsp;
+<a href="#SEC71_4" class="summary-letter"><b>E</b></a>
+ &nbsp;
+<a href="#SEC71_5" class="summary-letter"><b>F</b></a>
+ &nbsp;
+<a href="#SEC71_6" class="summary-letter"><b>G</b></a>
+ &nbsp;
+<a href="#SEC71_7" class="summary-letter"><b>H</b></a>
+ &nbsp;
+<a href="#SEC71_8" class="summary-letter"><b>I</b></a>
+ &nbsp;
+<a href="#SEC71_9" class="summary-letter"><b>J</b></a>
+ &nbsp;
+<a href="#SEC71_10" class="summary-letter"><b>L</b></a>
+ &nbsp;
+<a href="#SEC71_11" class="summary-letter"><b>M</b></a>
+ &nbsp;
+<a href="#SEC71_12" class="summary-letter"><b>N</b></a>
+ &nbsp;
+<a href="#SEC71_13" class="summary-letter"><b>O</b></a>
+ &nbsp;
+<a href="#SEC71_14" class="summary-letter"><b>P</b></a>
+ &nbsp;
+<a href="#SEC71_15" class="summary-letter"><b>R</b></a>
+ &nbsp;
+<a href="#SEC71_16" class="summary-letter"><b>S</b></a>
+ &nbsp;
+<a href="#SEC71_17" class="summary-letter"><b>T</b></a>
+ &nbsp;
+<a href="#SEC71_18" class="summary-letter"><b>U</b></a>
+ &nbsp;
+<a href="libunistring_19.html#INDEX0_0" class="summary-letter"><b>V</b></a>
+ &nbsp;
+<a href="libunistring_19.html#INDEX0_1" class="summary-letter"><b>W</b></a>
+ &nbsp;
+</td></tr></table>
+<table border="0" class="index-cp">
+<tr><td></td><th align="left">Index Entry</th><th align="left"> Section</th></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_0">A</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_9.html#IDX604">ambiguous width</a></td><td valign="top"><a href="libunistring_9.html#SEC37">9. Display width <code>&lt;uniwidth.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_2.html#IDX14">argument conventions</a></td><td valign="top"><a href="libunistring_2.html#SEC9">2. Conventions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_15.html#SEC59">autoconf macro</a></td><td valign="top"><a href="libunistring_15.html#SEC59">15.4 Autoconf macro</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_1">B</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC25">bidirectional category</a></td><td valign="top"><a href="libunistring_8.html#SEC25">8.3 Bidirectional category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_16.html#SEC61">bidirectional reordering</a></td><td valign="top"><a href="libunistring_16.html#SEC61">16. More advanced functionality</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC34">block</a></td><td valign="top"><a href="libunistring_8.html#SEC34">8.10 Blocks</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_11.html#SEC41">breaks, line</a></td><td valign="top"><a href="libunistring_11.html#SEC41">11. Line breaking <code>&lt;unilbrk.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_10.html#SEC38">breaks, word</a></td><td valign="top"><a href="libunistring_10.html#SEC38">10. Word breaks in strings <code>&lt;uniwbrk.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_15.html#SEC60">bug reports</a></td><td valign="top"><a href="libunistring_15.html#SEC60">15.5 Reporting problems</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_15.html#SEC60">bug tracker</a></td><td valign="top"><a href="libunistring_15.html#SEC60">15.5 Reporting problems</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_2">C</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#SEC6">C string functions</a></td><td valign="top"><a href="libunistring_1.html#SEC6">1.5 &lsquo;<samp>char *</samp>&rsquo; strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC35">C, programming language</a></td><td valign="top"><a href="libunistring_8.html#SEC35">8.11 ISO C and Java syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC36">C-like API</a></td><td valign="top"><a href="libunistring_8.html#SEC36">8.12 Classifications like in ISO C</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC24">canonical combining class</a></td><td valign="top"><a href="libunistring_8.html#SEC24">8.2 Canonical combining class</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#SEC53">case detection</a></td><td valign="top"><a href="libunistring_13.html#SEC53">13.5 Case detection</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#SEC50">case mappings</a></td><td valign="top"><a href="libunistring_13.html#SEC50">13.2 Case mappings of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX708"><code>casing_prefix_context_t</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX716"><code>casing_suffix_context_t</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#IDX10">char, type</a></td><td valign="top"><a href="libunistring_1.html#SEC6">1.5 &lsquo;<samp>char *</samp>&rsquo; strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#SEC44">combining, Unicode characters</a></td><td valign="top"><a href="libunistring_12.html#SEC44">12.2 Composition of Unicode characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX54">comparing</a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX110">comparing</a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#SEC52">comparing, ignoring case</a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX743">comparing, ignoring case, with collation rules</a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#SEC46">comparing, ignoring normalization</a></td><td valign="top"><a href="libunistring_12.html#SEC46">12.4 Normalizing comparisons</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#SEC52">comparing, ignoring normalization and case</a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX745">comparing, ignoring normalization and case, with collation rules</a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX681">comparing, ignoring normalization, with collation rules</a></td><td valign="top"><a href="libunistring_12.html#SEC46">12.4 Normalizing comparisons</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX114">comparing, with collation rules</a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX744">comparing, with collation rules, ignoring case</a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX682">comparing, with collation rules, ignoring normalization</a></td><td valign="top"><a href="libunistring_12.html#SEC46">12.4 Normalizing comparisons</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX746">comparing, with collation rules, ignoring normalization and case</a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_15.html#IDX771">compiler options</a></td><td valign="top"><a href="libunistring_15.html#SEC57">15.2 Compiler options</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#SEC44">composing, Unicode characters</a></td><td valign="top"><a href="libunistring_12.html#SEC44">12.2 Composition of Unicode characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#SEC13">converting</a></td><td valign="top"><a href="libunistring_4.html#SEC13">4.2 Elementary string conversions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX160">converting</a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX44">copying</a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX91">copying</a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX65">counting</a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_3">D</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#SEC43">decomposing</a></td><td valign="top"><a href="libunistring_12.html#SEC43">12.1 Decomposition of Unicode characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_15.html#SEC56">dependencies</a></td><td valign="top"><a href="libunistring_15.html#SEC56">15.1 Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#SEC53">detecting case</a></td><td valign="top"><a href="libunistring_13.html#SEC53">13.5 Case detection</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#SEC15">duplicating</a></td><td valign="top"><a href="libunistring_4.html#SEC15">4.4 Elementary string functions with memory allocation</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX121">duplicating</a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_4">E</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX156"><code>enum iconv_ilseq_handler</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_5">F</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_17.html#SEC69">FDL, GNU Free Documentation License</a></td><td valign="top"><a href="libunistring_17.html#SEC69">A.3 GNU Free Documentation License</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#SEC18">formatted output</a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_9.html#IDX607">fullwidth</a></td><td valign="top"><a href="libunistring_9.html#SEC37">9. Display width <code>&lt;uniwidth.h&gt;</code></a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_6">G</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC21">general category</a></td><td valign="top"><a href="libunistring_8.html#SEC21">8.1 General category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_15.html#IDX774"><code>gl_LIBUNISTRING</code></a></td><td valign="top"><a href="libunistring_15.html#SEC59">15.4 Autoconf macro</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_17.html#SEC63">GPL, GNU General Public License</a></td><td valign="top"><a href="libunistring_17.html#SEC63">A.1 GNU GENERAL PUBLIC LICENSE</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_7">H</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_9.html#IDX606">halfwidth</a></td><td valign="top"><a href="libunistring_9.html#SEC37">9. Display width <code>&lt;uniwidth.h&gt;</code></a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_8">I</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC35">identifiers</a></td><td valign="top"><a href="libunistring_8.html#SEC35">8.11 ISO C and Java syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_15.html#IDX770">installation</a></td><td valign="top"><a href="libunistring_15.html#SEC56">15.1 Installation</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#SEC3">internationalization</a></td><td valign="top"><a href="libunistring_1.html#SEC3">1.2 Unicode and Internationalization</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#SEC14">iterating</a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX75">iterating</a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_9">J</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC35">Java, programming language</a></td><td valign="top"><a href="libunistring_8.html#SEC35">8.11 ISO C and Java syntax</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_10">L</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_17.html#SEC68">LGPL, GNU Lesser General Public License</a></td><td valign="top"><a href="libunistring_17.html#SEC68">A.2 GNU LESSER GENERAL PUBLIC LICENSE</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_17.html#SEC69">License, GNU FDL</a></td><td valign="top"><a href="libunistring_17.html#SEC69">A.3 GNU Free Documentation License</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_17.html#SEC63">License, GNU GPL</a></td><td valign="top"><a href="libunistring_17.html#SEC63">A.1 GNU GENERAL PUBLIC LICENSE</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_17.html#SEC68">License, GNU LGPL</a></td><td valign="top"><a href="libunistring_17.html#SEC68">A.2 GNU LESSER GENERAL PUBLIC LICENSE</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_17.html#SEC62">Licenses</a></td><td valign="top"><a href="libunistring_17.html#SEC62">A. Licenses</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_11.html#SEC41">line breaks</a></td><td valign="top"><a href="libunistring_11.html#SEC41">11. Line breaking <code>&lt;unilbrk.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#SEC4">locale</a></td><td valign="top"><a href="libunistring_1.html#SEC4">1.3 Locale encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#IDX7">locale categories</a></td><td valign="top"><a href="libunistring_1.html#SEC4">1.3 Locale encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#IDX8">locale encoding</a></td><td valign="top"><a href="libunistring_1.html#SEC4">1.3 Locale encodings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX154">locale encoding</a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX697">locale language</a></td><td valign="top"><a href="libunistring_13.html#SEC50">13.2 Case mappings of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#IDX9">locale, multibyte</a></td><td valign="top"><a href="libunistring_1.html#SEC6">1.5 &lsquo;<samp>char *</samp>&rsquo; strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX155"><code>locale_charset</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#SEC50">lowercasing</a></td><td valign="top"><a href="libunistring_13.html#SEC50">13.2 Case mappings of strings</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_11">M</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_15.html#SEC60">mailing list</a></td><td valign="top"><a href="libunistring_15.html#SEC60">15.5 Reporting problems</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC29">mirroring, of Unicode character</a></td><td valign="top"><a href="libunistring_8.html#SEC29">8.7 Mirrored character</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_12">N</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#SEC42">normal forms</a></td><td valign="top"><a href="libunistring_12.html#SEC42">12. Normalization forms (composition and decomposition) <code>&lt;uninorm.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#SEC42">normalizing</a></td><td valign="top"><a href="libunistring_12.html#SEC42">12. Normalization forms (composition and decomposition) <code>&lt;uninorm.h&gt;</code></a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_13">O</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#SEC18">output, formatted</a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_14">P</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC30">properties, of Unicode character</a></td><td valign="top"><a href="libunistring_8.html#SEC30">8.8 Properties</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_15">R</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_14.html#SEC54">regular expression</a></td><td valign="top"><a href="libunistring_14.html#SEC54">14. Regular expressions <code>&lt;uniregex.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_16.html#IDX775">rendering</a></td><td valign="top"><a href="libunistring_16.html#SEC61">16. More advanced functionality</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_2.html#IDX15">return value conventions</a></td><td valign="top"><a href="libunistring_2.html#SEC9">2. Conventions</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_16">S</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC33">scripts</a></td><td valign="top"><a href="libunistring_8.html#SEC33">8.9 Scripts</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX61">searching, for a character</a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX125">searching, for a character</a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX141">searching, for a substring</a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#SEC47">stream, normalizing a</a></td><td valign="top"><a href="libunistring_12.html#SEC47">12.5 Normalization of streams of Unicode characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX689"><code>struct uninorm_filter</code></a></td><td valign="top"><a href="libunistring_12.html#SEC47">12.5 Normalization of streams of Unicode characters</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_17">T</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#SEC50">titlecasing</a></td><td valign="top"><a href="libunistring_13.html#SEC50">13.2 Case mappings of strings</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="SEC71_18">U</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX206"><code>u16_asnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX205"><code>u16_asprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX740"><code>u16_casecmp</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX752"><code>u16_casecoll</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX734"><code>u16_casefold</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX748"><code>u16_casexfrm</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX711"><code>u16_casing_prefix_context</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX714"><code>u16_casing_prefixes_context</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX719"><code>u16_casing_suffix_context</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX722"><code>u16_casing_suffixes_context</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX21"><code>u16_check</code></a></td><td valign="top"><a href="libunistring_4.html#SEC12">4.1 Elementary string checks</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX63"><code>u16_chr</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX56"><code>u16_cmp</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX59"><code>u16_cmp2</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX162"><code>u16_conv_from_encoding</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX165"><code>u16_conv_to_encoding</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX46"><code>u16_cpy</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX70"><code>u16_cpy_alloc</code></a></td><td valign="top"><a href="libunistring_4.html#SEC15">4.4 Elementary string functions with memory allocation</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX737"><code>u16_ct_casefold</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX728"><code>u16_ct_tolower</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX731"><code>u16_ct_totitle</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX725"><code>u16_ct_toupper</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX149"><code>u16_endswith</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX768"><code>u16_is_cased</code></a></td><td valign="top"><a href="libunistring_13.html#SEC53">13.5 Case detection</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX765"><code>u16_is_casefolded</code></a></td><td valign="top"><a href="libunistring_13.html#SEC53">13.5 Case detection</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX759"><code>u16_is_lowercase</code></a></td><td valign="top"><a href="libunistring_13.html#SEC53">13.5 Case detection</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX762"><code>u16_is_titlecase</code></a></td><td valign="top"><a href="libunistring_13.html#SEC53">13.5 Case detection</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX756"><code>u16_is_uppercase</code></a></td><td valign="top"><a href="libunistring_13.html#SEC53">13.5 Case detection</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX30"><code>u16_mblen</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX67"><code>u16_mbsnlen</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX36"><code>u16_mbtouc</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX33"><code>u16_mbtouc_unsafe</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX39"><code>u16_mbtoucr</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX49"><code>u16_move</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX80"><code>u16_next</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX676"><code>u16_normalize</code></a></td><td valign="top"><a href="libunistring_12.html#SEC45">12.3 Normalization of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX679"><code>u16_normcmp</code></a></td><td valign="top"><a href="libunistring_12.html#SEC46">12.4 Normalizing comparisons</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX687"><code>u16_normcoll</code></a></td><td valign="top"><a href="libunistring_12.html#SEC46">12.4 Normalizing comparisons</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX684"><code>u16_normxfrm</code></a></td><td valign="top"><a href="libunistring_12.html#SEC46">12.4 Normalizing comparisons</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_11.html#IDX639"><code>u16_possible_linebreaks</code></a></td><td valign="top"><a href="libunistring_11.html#SEC41">11. Line breaking <code>&lt;unilbrk.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX83"><code>u16_prev</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX52"><code>u16_set</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX204"><code>u16_snprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX203"><code>u16_sprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX146"><code>u16_startswith</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX96"><code>u16_stpcpy</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX102"><code>u16_stpncpy</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX105"><code>u16_strcat</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX127"><code>u16_strchr</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX112"><code>u16_strcmp</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX116"><code>u16_strcoll</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX168"><code>u16_strconv_from_encoding</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX174"><code>u16_strconv_from_locale</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX171"><code>u16_strconv_to_encoding</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX177"><code>u16_strconv_to_locale</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX93"><code>u16_strcpy</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX133"><code>u16_strcspn</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX123"><code>u16_strdup</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX86"><code>u16_strlen</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX73"><code>u16_strmblen</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX77"><code>u16_strmbtouc</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX108"><code>u16_strncat</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX119"><code>u16_strncmp</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX99"><code>u16_strncpy</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX89"><code>u16_strnlen</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX139"><code>u16_strpbrk</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX130"><code>u16_strrchr</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX136"><code>u16_strspn</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX143"><code>u16_strstr</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX152"><code>u16_strtok</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_9.html#IDX613"><code>u16_strwidth</code></a></td><td valign="top"><a href="libunistring_9.html#SEC37">9. Display width <code>&lt;uniwidth.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX26"><code>u16_to_u32</code></a></td><td valign="top"><a href="libunistring_4.html#SEC13">4.2 Elementary string conversions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX25"><code>u16_to_u8</code></a></td><td valign="top"><a href="libunistring_4.html#SEC13">4.2 Elementary string conversions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX703"><code>u16_tolower</code></a></td><td valign="top"><a href="libunistring_13.html#SEC50">13.2 Case mappings of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX706"><code>u16_totitle</code></a></td><td valign="top"><a href="libunistring_13.html#SEC50">13.2 Case mappings of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX700"><code>u16_toupper</code></a></td><td valign="top"><a href="libunistring_13.html#SEC50">13.2 Case mappings of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX214"><code>u16_u16_asnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX213"><code>u16_u16_asprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX212"><code>u16_u16_snprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX211"><code>u16_u16_sprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX218"><code>u16_u16_vasnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX217"><code>u16_u16_vasprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX216"><code>u16_u16_vsnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX215"><code>u16_u16_vsprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX42"><code>u16_uctomb</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX210"><code>u16_vasnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX209"><code>u16_vasprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX208"><code>u16_vsnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX207"><code>u16_vsprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_9.html#IDX610"><code>u16_width</code></a></td><td valign="top"><a href="libunistring_9.html#SEC37">9. Display width <code>&lt;uniwidth.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_11.html#IDX643"><code>u16_width_linebreaks</code></a></td><td valign="top"><a href="libunistring_11.html#SEC41">11. Line breaking <code>&lt;unilbrk.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_10.html#IDX616"><code>u16_wordbreaks</code></a></td><td valign="top"><a href="libunistring_10.html#SEC39">10.1 Word breaks in a string</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX222"><code>u32_asnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX221"><code>u32_asprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX741"><code>u32_casecmp</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX753"><code>u32_casecoll</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX735"><code>u32_casefold</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX749"><code>u32_casexfrm</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX712"><code>u32_casing_prefix_context</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX715"><code>u32_casing_prefixes_context</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX720"><code>u32_casing_suffix_context</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX723"><code>u32_casing_suffixes_context</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX22"><code>u32_check</code></a></td><td valign="top"><a href="libunistring_4.html#SEC12">4.1 Elementary string checks</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX64"><code>u32_chr</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX57"><code>u32_cmp</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX60"><code>u32_cmp2</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX163"><code>u32_conv_from_encoding</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX166"><code>u32_conv_to_encoding</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX47"><code>u32_cpy</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX71"><code>u32_cpy_alloc</code></a></td><td valign="top"><a href="libunistring_4.html#SEC15">4.4 Elementary string functions with memory allocation</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX738"><code>u32_ct_casefold</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX729"><code>u32_ct_tolower</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX732"><code>u32_ct_totitle</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX726"><code>u32_ct_toupper</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX150"><code>u32_endswith</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX769"><code>u32_is_cased</code></a></td><td valign="top"><a href="libunistring_13.html#SEC53">13.5 Case detection</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX766"><code>u32_is_casefolded</code></a></td><td valign="top"><a href="libunistring_13.html#SEC53">13.5 Case detection</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX760"><code>u32_is_lowercase</code></a></td><td valign="top"><a href="libunistring_13.html#SEC53">13.5 Case detection</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX763"><code>u32_is_titlecase</code></a></td><td valign="top"><a href="libunistring_13.html#SEC53">13.5 Case detection</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX757"><code>u32_is_uppercase</code></a></td><td valign="top"><a href="libunistring_13.html#SEC53">13.5 Case detection</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX31"><code>u32_mblen</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX68"><code>u32_mbsnlen</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX37"><code>u32_mbtouc</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX34"><code>u32_mbtouc_unsafe</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX40"><code>u32_mbtoucr</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX50"><code>u32_move</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX81"><code>u32_next</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX677"><code>u32_normalize</code></a></td><td valign="top"><a href="libunistring_12.html#SEC45">12.3 Normalization of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX680"><code>u32_normcmp</code></a></td><td valign="top"><a href="libunistring_12.html#SEC46">12.4 Normalizing comparisons</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX688"><code>u32_normcoll</code></a></td><td valign="top"><a href="libunistring_12.html#SEC46">12.4 Normalizing comparisons</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX685"><code>u32_normxfrm</code></a></td><td valign="top"><a href="libunistring_12.html#SEC46">12.4 Normalizing comparisons</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_11.html#IDX640"><code>u32_possible_linebreaks</code></a></td><td valign="top"><a href="libunistring_11.html#SEC41">11. Line breaking <code>&lt;unilbrk.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX84"><code>u32_prev</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX53"><code>u32_set</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX220"><code>u32_snprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX219"><code>u32_sprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX147"><code>u32_startswith</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX97"><code>u32_stpcpy</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX103"><code>u32_stpncpy</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX106"><code>u32_strcat</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX128"><code>u32_strchr</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX113"><code>u32_strcmp</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX117"><code>u32_strcoll</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX169"><code>u32_strconv_from_encoding</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX175"><code>u32_strconv_from_locale</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX172"><code>u32_strconv_to_encoding</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX178"><code>u32_strconv_to_locale</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX94"><code>u32_strcpy</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX134"><code>u32_strcspn</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX124"><code>u32_strdup</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX87"><code>u32_strlen</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX74"><code>u32_strmblen</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX78"><code>u32_strmbtouc</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX109"><code>u32_strncat</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX120"><code>u32_strncmp</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX100"><code>u32_strncpy</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX90"><code>u32_strnlen</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX140"><code>u32_strpbrk</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX131"><code>u32_strrchr</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX137"><code>u32_strspn</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX144"><code>u32_strstr</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX153"><code>u32_strtok</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_9.html#IDX614"><code>u32_strwidth</code></a></td><td valign="top"><a href="libunistring_9.html#SEC37">9. Display width <code>&lt;uniwidth.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX28"><code>u32_to_u16</code></a></td><td valign="top"><a href="libunistring_4.html#SEC13">4.2 Elementary string conversions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX27"><code>u32_to_u8</code></a></td><td valign="top"><a href="libunistring_4.html#SEC13">4.2 Elementary string conversions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX704"><code>u32_tolower</code></a></td><td valign="top"><a href="libunistring_13.html#SEC50">13.2 Case mappings of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX707"><code>u32_totitle</code></a></td><td valign="top"><a href="libunistring_13.html#SEC50">13.2 Case mappings of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX701"><code>u32_toupper</code></a></td><td valign="top"><a href="libunistring_13.html#SEC50">13.2 Case mappings of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX230"><code>u32_u32_asnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX229"><code>u32_u32_asprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX228"><code>u32_u32_snprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX227"><code>u32_u32_sprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX234"><code>u32_u32_vasnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX233"><code>u32_u32_vasprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX232"><code>u32_u32_vsnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX231"><code>u32_u32_vsprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX43"><code>u32_uctomb</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX226"><code>u32_vasnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX225"><code>u32_vasprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX224"><code>u32_vsnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX223"><code>u32_vsprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_9.html#IDX611"><code>u32_width</code></a></td><td valign="top"><a href="libunistring_9.html#SEC37">9. Display width <code>&lt;uniwidth.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_11.html#IDX644"><code>u32_width_linebreaks</code></a></td><td valign="top"><a href="libunistring_11.html#SEC41">11. Line breaking <code>&lt;unilbrk.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_10.html#IDX617"><code>u32_wordbreaks</code></a></td><td valign="top"><a href="libunistring_10.html#SEC39">10.1 Word breaks in a string</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX190"><code>u8_asnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX189"><code>u8_asprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX739"><code>u8_casecmp</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX751"><code>u8_casecoll</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX733"><code>u8_casefold</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX747"><code>u8_casexfrm</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX710"><code>u8_casing_prefix_context</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX713"><code>u8_casing_prefixes_context</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX718"><code>u8_casing_suffix_context</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX721"><code>u8_casing_suffixes_context</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX20"><code>u8_check</code></a></td><td valign="top"><a href="libunistring_4.html#SEC12">4.1 Elementary string checks</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX62"><code>u8_chr</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX55"><code>u8_cmp</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX58"><code>u8_cmp2</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX161"><code>u8_conv_from_encoding</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX164"><code>u8_conv_to_encoding</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX45"><code>u8_cpy</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX69"><code>u8_cpy_alloc</code></a></td><td valign="top"><a href="libunistring_4.html#SEC15">4.4 Elementary string functions with memory allocation</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX736"><code>u8_ct_casefold</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX727"><code>u8_ct_tolower</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX730"><code>u8_ct_totitle</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX724"><code>u8_ct_toupper</code></a></td><td valign="top"><a href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX148"><code>u8_endswith</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX767"><code>u8_is_cased</code></a></td><td valign="top"><a href="libunistring_13.html#SEC53">13.5 Case detection</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX764"><code>u8_is_casefolded</code></a></td><td valign="top"><a href="libunistring_13.html#SEC53">13.5 Case detection</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX758"><code>u8_is_lowercase</code></a></td><td valign="top"><a href="libunistring_13.html#SEC53">13.5 Case detection</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX761"><code>u8_is_titlecase</code></a></td><td valign="top"><a href="libunistring_13.html#SEC53">13.5 Case detection</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX755"><code>u8_is_uppercase</code></a></td><td valign="top"><a href="libunistring_13.html#SEC53">13.5 Case detection</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX29"><code>u8_mblen</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX66"><code>u8_mbsnlen</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX35"><code>u8_mbtouc</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX32"><code>u8_mbtouc_unsafe</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX38"><code>u8_mbtoucr</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX48"><code>u8_move</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX79"><code>u8_next</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX675"><code>u8_normalize</code></a></td><td valign="top"><a href="libunistring_12.html#SEC45">12.3 Normalization of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX678"><code>u8_normcmp</code></a></td><td valign="top"><a href="libunistring_12.html#SEC46">12.4 Normalizing comparisons</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX686"><code>u8_normcoll</code></a></td><td valign="top"><a href="libunistring_12.html#SEC46">12.4 Normalizing comparisons</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX683"><code>u8_normxfrm</code></a></td><td valign="top"><a href="libunistring_12.html#SEC46">12.4 Normalizing comparisons</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_11.html#IDX638"><code>u8_possible_linebreaks</code></a></td><td valign="top"><a href="libunistring_11.html#SEC41">11. Line breaking <code>&lt;unilbrk.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX82"><code>u8_prev</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX51"><code>u8_set</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX188"><code>u8_snprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX187"><code>u8_sprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX145"><code>u8_startswith</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX95"><code>u8_stpcpy</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX101"><code>u8_stpncpy</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX104"><code>u8_strcat</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX126"><code>u8_strchr</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX111"><code>u8_strcmp</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX115"><code>u8_strcoll</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX167"><code>u8_strconv_from_encoding</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX173"><code>u8_strconv_from_locale</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX170"><code>u8_strconv_to_encoding</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_5.html#IDX176"><code>u8_strconv_to_locale</code></a></td><td valign="top"><a href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX92"><code>u8_strcpy</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX132"><code>u8_strcspn</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX122"><code>u8_strdup</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX85"><code>u8_strlen</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX72"><code>u8_strmblen</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX76"><code>u8_strmbtouc</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX107"><code>u8_strncat</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX118"><code>u8_strncmp</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX98"><code>u8_strncpy</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX88"><code>u8_strnlen</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX138"><code>u8_strpbrk</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX129"><code>u8_strrchr</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX135"><code>u8_strspn</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX142"><code>u8_strstr</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX151"><code>u8_strtok</code></a></td><td valign="top"><a href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_9.html#IDX612"><code>u8_strwidth</code></a></td><td valign="top"><a href="libunistring_9.html#SEC37">9. Display width <code>&lt;uniwidth.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX23"><code>u8_to_u16</code></a></td><td valign="top"><a href="libunistring_4.html#SEC13">4.2 Elementary string conversions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX24"><code>u8_to_u32</code></a></td><td valign="top"><a href="libunistring_4.html#SEC13">4.2 Elementary string conversions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX702"><code>u8_tolower</code></a></td><td valign="top"><a href="libunistring_13.html#SEC50">13.2 Case mappings of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX705"><code>u8_totitle</code></a></td><td valign="top"><a href="libunistring_13.html#SEC50">13.2 Case mappings of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX699"><code>u8_toupper</code></a></td><td valign="top"><a href="libunistring_13.html#SEC50">13.2 Case mappings of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX198"><code>u8_u8_asnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX197"><code>u8_u8_asprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX196"><code>u8_u8_snprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX195"><code>u8_u8_sprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX202"><code>u8_u8_vasnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX201"><code>u8_u8_vasprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX200"><code>u8_u8_vsnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX199"><code>u8_u8_vsprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#IDX41"><code>u8_uctomb</code></a></td><td valign="top"><a href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX194"><code>u8_vasnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX193"><code>u8_vasprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX192"><code>u8_vsnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX191"><code>u8_vsprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_9.html#IDX609"><code>u8_width</code></a></td><td valign="top"><a href="libunistring_9.html#SEC37">9. Display width <code>&lt;uniwidth.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_11.html#IDX642"><code>u8_width_linebreaks</code></a></td><td valign="top"><a href="libunistring_11.html#SEC41">11. Line breaking <code>&lt;unilbrk.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_10.html#IDX615"><code>u8_wordbreaks</code></a></td><td valign="top"><a href="libunistring_10.html#SEC39">10.1 Word breaks in a string</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX581"><code>uc_all_blocks</code></a></td><td valign="top"><a href="libunistring_8.html#SEC34">8.10 Blocks</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX576"><code>uc_all_scripts</code></a></td><td valign="top"><a href="libunistring_8.html#SEC33">8.9 Scripts</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX402"><code>uc_bidi_category</code></a></td><td valign="top"><a href="libunistring_8.html#SEC25">8.3 Bidirectional category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX401"><code>uc_bidi_category_byname</code></a></td><td valign="top"><a href="libunistring_8.html#SEC25">8.3 Bidirectional category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX400"><code>uc_bidi_category_name</code></a></td><td valign="top"><a href="libunistring_8.html#SEC25">8.3 Bidirectional category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX579"><code>uc_block</code></a></td><td valign="top"><a href="libunistring_8.html#SEC34">8.10 Blocks</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX577"><code>uc_block_t</code></a></td><td valign="top"><a href="libunistring_8.html#SEC34">8.10 Blocks</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX589"><code>uc_c_ident_category</code></a></td><td valign="top"><a href="libunistring_8.html#SEC35">8.11 ISO C and Java syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX665"><code>uc_canonical_decomposition</code></a></td><td valign="top"><a href="libunistring_12.html#SEC43">12.1 Decomposition of Unicode characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX380"><code>uc_combining_class</code></a></td><td valign="top"><a href="libunistring_8.html#SEC24">8.2 Canonical combining class</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX666"><code>uc_composition</code></a></td><td valign="top"><a href="libunistring_12.html#SEC44">12.2 Composition of Unicode characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX404"><code>uc_decimal_value</code></a></td><td valign="top"><a href="libunistring_8.html#SEC26">8.4 Decimal digit value</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX664"><code>uc_decomposition</code></a></td><td valign="top"><a href="libunistring_12.html#SEC43">12.1 Decomposition of Unicode characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX405"><code>uc_digit_value</code></a></td><td valign="top"><a href="libunistring_8.html#SEC27">8.5 Digit value</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX406"><code>uc_fraction_t</code></a></td><td valign="top"><a href="libunistring_8.html#SEC28">8.6 Numeric value</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX321"><code>uc_general_category</code></a></td><td valign="top"><a href="libunistring_8.html#SEC22">8.1.1 The object oriented API for general category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX317"><code>uc_general_category_and</code></a></td><td valign="top"><a href="libunistring_8.html#SEC22">8.1.1 The object oriented API for general category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX318"><code>uc_general_category_and_not</code></a></td><td valign="top"><a href="libunistring_8.html#SEC22">8.1.1 The object oriented API for general category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX320"><code>uc_general_category_byname</code></a></td><td valign="top"><a href="libunistring_8.html#SEC22">8.1.1 The object oriented API for general category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX319"><code>uc_general_category_name</code></a></td><td valign="top"><a href="libunistring_8.html#SEC22">8.1.1 The object oriented API for general category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX316"><code>uc_general_category_or</code></a></td><td valign="top"><a href="libunistring_8.html#SEC22">8.1.1 The object oriented API for general category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX241"><code>uc_general_category_t</code></a></td><td valign="top"><a href="libunistring_8.html#SEC22">8.1.1 The object oriented API for general category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX592"><code>uc_is_alnum</code></a></td><td valign="top"><a href="libunistring_8.html#SEC36">8.12 Classifications like in ISO C</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX593"><code>uc_is_alpha</code></a></td><td valign="top"><a href="libunistring_8.html#SEC36">8.12 Classifications like in ISO C</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX403"><code>uc_is_bidi_category</code></a></td><td valign="top"><a href="libunistring_8.html#SEC25">8.3 Bidirectional category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX603"><code>uc_is_blank</code></a></td><td valign="top"><a href="libunistring_8.html#SEC36">8.12 Classifications like in ISO C</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX580"><code>uc_is_block</code></a></td><td valign="top"><a href="libunistring_8.html#SEC34">8.10 Blocks</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX582"><code>uc_is_c_whitespace</code></a></td><td valign="top"><a href="libunistring_8.html#SEC35">8.11 ISO C and Java syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX594"><code>uc_is_cntrl</code></a></td><td valign="top"><a href="libunistring_8.html#SEC36">8.12 Classifications like in ISO C</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX595"><code>uc_is_digit</code></a></td><td valign="top"><a href="libunistring_8.html#SEC36">8.12 Classifications like in ISO C</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX322"><code>uc_is_general_category</code></a></td><td valign="top"><a href="libunistring_8.html#SEC22">8.1.1 The object oriented API for general category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX360"><code>uc_is_general_category_withtable</code></a></td><td valign="top"><a href="libunistring_8.html#SEC23">8.1.2 The bit mask API for general category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX596"><code>uc_is_graph</code></a></td><td valign="top"><a href="libunistring_8.html#SEC36">8.12 Classifications like in ISO C</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX583"><code>uc_is_java_whitespace</code></a></td><td valign="top"><a href="libunistring_8.html#SEC35">8.11 ISO C and Java syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX597"><code>uc_is_lower</code></a></td><td valign="top"><a href="libunistring_8.html#SEC36">8.12 Classifications like in ISO C</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX598"><code>uc_is_print</code></a></td><td valign="top"><a href="libunistring_8.html#SEC36">8.12 Classifications like in ISO C</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX491"><code>uc_is_property</code></a></td><td valign="top"><a href="libunistring_8.html#SEC31">8.8.1 Properties as objects &ndash; the object oriented API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX493"><code>uc_is_property_alphabetic</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX540"><code>uc_is_property_ascii_hex_digit</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX529"><code>uc_is_property_bidi_arabic_digit</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX525"><code>uc_is_property_bidi_arabic_right_to_left</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX531"><code>uc_is_property_bidi_block_separator</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX535"><code>uc_is_property_bidi_boundary_neutral</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX530"><code>uc_is_property_bidi_common_separator</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX522"><code>uc_is_property_bidi_control</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX537"><code>uc_is_property_bidi_embedding_or_override</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX527"><code>uc_is_property_bidi_eur_num_separator</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX528"><code>uc_is_property_bidi_eur_num_terminator</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX526"><code>uc_is_property_bidi_european_digit</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX524"><code>uc_is_property_bidi_hebrew_right_to_left</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX523"><code>uc_is_property_bidi_left_to_right</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX534"><code>uc_is_property_bidi_non_spacing_mark</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX538"><code>uc_is_property_bidi_other_neutral</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX536"><code>uc_is_property_bidi_pdf</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX532"><code>uc_is_property_bidi_segment_separator</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX533"><code>uc_is_property_bidi_whitespace</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX564"><code>uc_is_property_combining</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX565"><code>uc_is_property_composite</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX559"><code>uc_is_property_currency_symbol</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX551"><code>uc_is_property_dash</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX566"><code>uc_is_property_decimal_digit</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX496"><code>uc_is_property_default_ignorable_code_point</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX498"><code>uc_is_property_deprecated</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX568"><code>uc_is_property_diacritic</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX569"><code>uc_is_property_extender</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX550"><code>uc_is_property_format_control</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX518"><code>uc_is_property_grapheme_base</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX519"><code>uc_is_property_grapheme_extend</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX521"><code>uc_is_property_grapheme_link</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX539"><code>uc_is_property_hex_digit</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX552"><code>uc_is_property_hyphen</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX511"><code>uc_is_property_id_continue</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX509"><code>uc_is_property_id_start</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX541"><code>uc_is_property_ideographic</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX544"><code>uc_is_property_ids_binary_operator</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX545"><code>uc_is_property_ids_trinary_operator</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX570"><code>uc_is_property_ignorable_control</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX549"><code>uc_is_property_iso_control</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX517"><code>uc_is_property_join_control</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX563"><code>uc_is_property_left_of_pair</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX554"><code>uc_is_property_line_separator</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX499"><code>uc_is_property_logical_order_exception</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX505"><code>uc_is_property_lowercase</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX560"><code>uc_is_property_math</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX548"><code>uc_is_property_non_break</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX495"><code>uc_is_property_not_a_character</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX567"><code>uc_is_property_numeric</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX494"><code>uc_is_property_other_alphabetic</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX497"><code>uc_is_property_other_default_ignorable_code_point</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX520"><code>uc_is_property_other_grapheme_extend</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX512"><code>uc_is_property_other_id_continue</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX510"><code>uc_is_property_other_id_start</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX506"><code>uc_is_property_other_lowercase</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX561"><code>uc_is_property_other_math</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX504"><code>uc_is_property_other_uppercase</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX562"><code>uc_is_property_paired_punctuation</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX555"><code>uc_is_property_paragraph_separator</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX516"><code>uc_is_property_pattern_syntax</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX515"><code>uc_is_property_pattern_white_space</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX501"><code>uc_is_property_private_use</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX553"><code>uc_is_property_punctuation</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX556"><code>uc_is_property_quotation_mark</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX543"><code>uc_is_property_radical</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX557"><code>uc_is_property_sentence_terminal</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX508"><code>uc_is_property_soft_dotted</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX547"><code>uc_is_property_space</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX558"><code>uc_is_property_terminal_punctuation</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX507"><code>uc_is_property_titlecase</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX502"><code>uc_is_property_unassigned_code_value</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX542"><code>uc_is_property_unified_ideograph</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX503"><code>uc_is_property_uppercase</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX500"><code>uc_is_property_variation_selector</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX492"><code>uc_is_property_white_space</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX514"><code>uc_is_property_xid_continue</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX513"><code>uc_is_property_xid_start</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX546"><code>uc_is_property_zero_width</code></a></td><td valign="top"><a href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX599"><code>uc_is_punct</code></a></td><td valign="top"><a href="libunistring_8.html#SEC36">8.12 Classifications like in ISO C</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX575"><code>uc_is_script</code></a></td><td valign="top"><a href="libunistring_8.html#SEC33">8.9 Scripts</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX600"><code>uc_is_space</code></a></td><td valign="top"><a href="libunistring_8.html#SEC36">8.12 Classifications like in ISO C</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX601"><code>uc_is_upper</code></a></td><td valign="top"><a href="libunistring_8.html#SEC36">8.12 Classifications like in ISO C</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX602"><code>uc_is_xdigit</code></a></td><td valign="top"><a href="libunistring_8.html#SEC36">8.12 Classifications like in ISO C</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX591"><code>uc_java_ident_category</code></a></td><td valign="top"><a href="libunistring_8.html#SEC35">8.11 ISO C and Java syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX698"><code>uc_locale_language</code></a></td><td valign="top"><a href="libunistring_13.html#SEC50">13.2 Case mappings of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX408"><code>uc_mirror_char</code></a></td><td valign="top"><a href="libunistring_8.html#SEC29">8.7 Mirrored character</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX407"><code>uc_numeric_value</code></a></td><td valign="top"><a href="libunistring_8.html#SEC28">8.6 Numeric value</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX489"><code>uc_property_byname</code></a></td><td valign="top"><a href="libunistring_8.html#SEC31">8.8.1 Properties as objects &ndash; the object oriented API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX490"><code>uc_property_is_valid</code></a></td><td valign="top"><a href="libunistring_8.html#SEC31">8.8.1 Properties as objects &ndash; the object oriented API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX409"><code>uc_property_t</code></a></td><td valign="top"><a href="libunistring_8.html#SEC31">8.8.1 Properties as objects &ndash; the object oriented API</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX573"><code>uc_script</code></a></td><td valign="top"><a href="libunistring_8.html#SEC33">8.9 Scripts</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX574"><code>uc_script_byname</code></a></td><td valign="top"><a href="libunistring_8.html#SEC33">8.9 Scripts</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX571"><code>uc_script_t</code></a></td><td valign="top"><a href="libunistring_8.html#SEC33">8.9 Scripts</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX695"><code>uc_tolower</code></a></td><td valign="top"><a href="libunistring_13.html#SEC49">13.1 Case mappings of characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX696"><code>uc_totitle</code></a></td><td valign="top"><a href="libunistring_13.html#SEC49">13.1 Case mappings of characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX694"><code>uc_toupper</code></a></td><td valign="top"><a href="libunistring_13.html#SEC49">13.1 Case mappings of characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_9.html#IDX608"><code>uc_width</code></a></td><td valign="top"><a href="libunistring_9.html#SEC37">9. Display width <code>&lt;uniwidth.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_10.html#IDX632"><code>uc_wordbreak_property</code></a></td><td valign="top"><a href="libunistring_10.html#SEC40">10.2 Word break property</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#IDX6">UCS-4</a></td><td valign="top"><a href="libunistring_1.html#SEC2">1.1 Unicode</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_3.html#IDX19"><code>ucs4_t</code></a></td><td valign="top"><a href="libunistring_3.html#SEC10">3. Elementary types <code>&lt;unitypes.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_3.html#IDX17"><code>uint16_t</code></a></td><td valign="top"><a href="libunistring_3.html#SEC10">3. Elementary types <code>&lt;unitypes.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_3.html#IDX18"><code>uint32_t</code></a></td><td valign="top"><a href="libunistring_3.html#SEC10">3. Elementary types <code>&lt;unitypes.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_3.html#IDX16"><code>uint8_t</code></a></td><td valign="top"><a href="libunistring_3.html#SEC10">3. Elementary types <code>&lt;unitypes.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX182"><code>ulc_asnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX181"><code>ulc_asprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX742"><code>ulc_casecmp</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX754"><code>ulc_casecoll</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#IDX750"><code>ulc_casexfrm</code></a></td><td valign="top"><a href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX235"><code>ulc_fprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_11.html#IDX641"><code>ulc_possible_linebreaks</code></a></td><td valign="top"><a href="libunistring_11.html#SEC41">11. Line breaking <code>&lt;unilbrk.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX180"><code>ulc_snprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX179"><code>ulc_sprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX186"><code>ulc_vasnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX185"><code>ulc_vasprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX236"><code>ulc_vfprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX184"><code>ulc_vsnprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_6.html#IDX183"><code>ulc_vsprintf</code></a></td><td valign="top"><a href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_11.html#IDX645"><code>ulc_width_linebreaks</code></a></td><td valign="top"><a href="libunistring_11.html#SEC41">11. Line breaking <code>&lt;unilbrk.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_10.html#IDX618"><code>ulc_wordbreaks</code></a></td><td valign="top"><a href="libunistring_10.html#SEC39">10.1 Word breaks in a string</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#SEC2">Unicode</a></td><td valign="top"><a href="libunistring_1.html#SEC2">1.1 Unicode</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC25">Unicode character, bidirectional category</a></td><td valign="top"><a href="libunistring_8.html#SEC25">8.3 Bidirectional category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX578">Unicode character, block</a></td><td valign="top"><a href="libunistring_8.html#SEC34">8.10 Blocks</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC24">Unicode character, canonical combining class</a></td><td valign="top"><a href="libunistring_8.html#SEC24">8.2 Canonical combining class</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#SEC49">Unicode character, case mappings</a></td><td valign="top"><a href="libunistring_13.html#SEC49">13.1 Case mappings of characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC21">Unicode character, classification</a></td><td valign="top"><a href="libunistring_8.html#SEC21">8.1 General category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC36">Unicode character, classification like in C</a></td><td valign="top"><a href="libunistring_8.html#SEC36">8.12 Classifications like in ISO C</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC21">Unicode character, general category</a></td><td valign="top"><a href="libunistring_8.html#SEC21">8.1 General category</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC29">Unicode character, mirroring</a></td><td valign="top"><a href="libunistring_8.html#SEC29">8.7 Mirrored character</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_7.html#SEC19">Unicode character, name</a></td><td valign="top"><a href="libunistring_7.html#SEC19">7. Names of Unicode characters <code>&lt;uniname.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC30">Unicode character, properties</a></td><td valign="top"><a href="libunistring_8.html#SEC30">8.8 Properties</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX572">Unicode character, script</a></td><td valign="top"><a href="libunistring_8.html#SEC33">8.9 Scripts</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX588">Unicode character, validity in C identifiers</a></td><td valign="top"><a href="libunistring_8.html#SEC35">8.11 ISO C and Java syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#IDX590">Unicode character, validity in Java identifiers</a></td><td valign="top"><a href="libunistring_8.html#SEC35">8.11 ISO C and Java syntax</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC26">Unicode character, value</a></td><td valign="top"><a href="libunistring_8.html#SEC26">8.4 Decimal digit value</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC27">Unicode character, value</a></td><td valign="top"><a href="libunistring_8.html#SEC27">8.5 Digit value</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC28">Unicode character, value</a></td><td valign="top"><a href="libunistring_8.html#SEC28">8.6 Numeric value</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_9.html#IDX605">Unicode character, width</a></td><td valign="top"><a href="libunistring_9.html#SEC37">9. Display width <code>&lt;uniwidth.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_7.html#IDX238"><code>unicode_character_name</code></a></td><td valign="top"><a href="libunistring_7.html#SEC19">7. Names of Unicode characters <code>&lt;uniname.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_7.html#IDX239"><code>unicode_name_character</code></a></td><td valign="top"><a href="libunistring_7.html#SEC19">7. Names of Unicode characters <code>&lt;uniname.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX674"><code>uninorm_decomposing_form</code></a></td><td valign="top"><a href="libunistring_12.html#SEC45">12.3 Normalization of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX690"><code>uninorm_filter_create</code></a></td><td valign="top"><a href="libunistring_12.html#SEC47">12.5 Normalization of streams of Unicode characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX692"><code>uninorm_filter_flush</code></a></td><td valign="top"><a href="libunistring_12.html#SEC47">12.5 Normalization of streams of Unicode characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX693"><code>uninorm_filter_free</code></a></td><td valign="top"><a href="libunistring_12.html#SEC47">12.5 Normalization of streams of Unicode characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX691"><code>uninorm_filter_write</code></a></td><td valign="top"><a href="libunistring_12.html#SEC47">12.5 Normalization of streams of Unicode characters</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX672"><code>uninorm_is_compat_decomposing</code></a></td><td valign="top"><a href="libunistring_12.html#SEC45">12.3 Normalization of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX673"><code>uninorm_is_composing</code></a></td><td valign="top"><a href="libunistring_12.html#SEC45">12.3 Normalization of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_12.html#IDX667"><code>uninorm_t</code></a></td><td valign="top"><a href="libunistring_12.html#SEC45">12.3 Normalization of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_13.html#SEC50">uppercasing</a></td><td valign="top"><a href="libunistring_13.html#SEC50">13.2 Case mappings of strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#IDX1">use cases</a></td><td valign="top"><a href="libunistring_1.html#SEC1">1. Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#IDX4">UTF-16</a></td><td valign="top"><a href="libunistring_1.html#SEC2">1.1 Unicode</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#IDX12">UTF-16, strings</a></td><td valign="top"><a href="libunistring_1.html#SEC8">1.7 Unicode strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#IDX5">UTF-32</a></td><td valign="top"><a href="libunistring_1.html#SEC2">1.1 Unicode</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#IDX13">UTF-32, strings</a></td><td valign="top"><a href="libunistring_1.html#SEC8">1.7 Unicode strings</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#IDX3">UTF-8</a></td><td valign="top"><a href="libunistring_1.html#SEC2">1.1 Unicode</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#IDX11">UTF-8, strings</a></td><td valign="top"><a href="libunistring_1.html#SEC8">1.7 Unicode strings</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="#SEC71_0" class="summary-letter"><b>A</b></a>
+ &nbsp;
+<a href="#SEC71_1" class="summary-letter"><b>B</b></a>
+ &nbsp;
+<a href="#SEC71_2" class="summary-letter"><b>C</b></a>
+ &nbsp;
+<a href="#SEC71_3" class="summary-letter"><b>D</b></a>
+ &nbsp;
+<a href="#SEC71_4" class="summary-letter"><b>E</b></a>
+ &nbsp;
+<a href="#SEC71_5" class="summary-letter"><b>F</b></a>
+ &nbsp;
+<a href="#SEC71_6" class="summary-letter"><b>G</b></a>
+ &nbsp;
+<a href="#SEC71_7" class="summary-letter"><b>H</b></a>
+ &nbsp;
+<a href="#SEC71_8" class="summary-letter"><b>I</b></a>
+ &nbsp;
+<a href="#SEC71_9" class="summary-letter"><b>J</b></a>
+ &nbsp;
+<a href="#SEC71_10" class="summary-letter"><b>L</b></a>
+ &nbsp;
+<a href="#SEC71_11" class="summary-letter"><b>M</b></a>
+ &nbsp;
+<a href="#SEC71_12" class="summary-letter"><b>N</b></a>
+ &nbsp;
+<a href="#SEC71_13" class="summary-letter"><b>O</b></a>
+ &nbsp;
+<a href="#SEC71_14" class="summary-letter"><b>P</b></a>
+ &nbsp;
+<a href="#SEC71_15" class="summary-letter"><b>R</b></a>
+ &nbsp;
+<a href="#SEC71_16" class="summary-letter"><b>S</b></a>
+ &nbsp;
+<a href="#SEC71_17" class="summary-letter"><b>T</b></a>
+ &nbsp;
+<a href="#SEC71_18" class="summary-letter"><b>U</b></a>
+ &nbsp;
+<a href="libunistring_19.html#INDEX0_0" class="summary-letter"><b>V</b></a>
+ &nbsp;
+<a href="libunistring_19.html#INDEX0_1" class="summary-letter"><b>W</b></a>
+ &nbsp;
+</td></tr></table>
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_17.html#SEC62" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_19.html#INDEX0" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_19.html b/doc/libunistring_19.html
new file mode 100644
index 00000000..5974e2f6
--- /dev/null
+++ b/doc/libunistring_19.html
@@ -0,0 +1,188 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: Index: V &ndash; W</title>
+
+<meta name="description" content="GNU libunistring: Index: V &ndash; W">
+<meta name="keywords" content="GNU libunistring: Index: V &ndash; W">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[ &gt;&gt; ]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="INDEX0"></a>
+<h1 class="unnumbered"> Index: V &ndash; W </h1>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="libunistring_18.html#SEC71_0" class="summary-letter"><b>A</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_1" class="summary-letter"><b>B</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_2" class="summary-letter"><b>C</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_3" class="summary-letter"><b>D</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_4" class="summary-letter"><b>E</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_5" class="summary-letter"><b>F</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_6" class="summary-letter"><b>G</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_7" class="summary-letter"><b>H</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_8" class="summary-letter"><b>I</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_9" class="summary-letter"><b>J</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_10" class="summary-letter"><b>L</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_11" class="summary-letter"><b>M</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_12" class="summary-letter"><b>N</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_13" class="summary-letter"><b>O</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_14" class="summary-letter"><b>P</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_15" class="summary-letter"><b>R</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_16" class="summary-letter"><b>S</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_17" class="summary-letter"><b>T</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_18" class="summary-letter"><b>U</b></a>
+ &nbsp;
+<a href="#INDEX0_0" class="summary-letter"><b>V</b></a>
+ &nbsp;
+<a href="#INDEX0_1" class="summary-letter"><b>W</b></a>
+ &nbsp;
+</td></tr></table>
+<table border="0" class="index-cp">
+<tr><td></td><th align="left">Index Entry</th><th align="left"> Section</th></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="INDEX0_0">V</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#SEC12">validity</a></td><td valign="top"><a href="libunistring_4.html#SEC12">4.1 Elementary string checks</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#IDX2">value, of libunistring</a></td><td valign="top"><a href="libunistring_1.html#SEC1">1. Introduction</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC26">value, of Unicode character</a></td><td valign="top"><a href="libunistring_8.html#SEC26">8.4 Decimal digit value</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC27">value, of Unicode character</a></td><td valign="top"><a href="libunistring_8.html#SEC27">8.5 Digit value</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_8.html#SEC28">value, of Unicode character</a></td><td valign="top"><a href="libunistring_8.html#SEC28">8.6 Numeric value</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_4.html#SEC12">verification</a></td><td valign="top"><a href="libunistring_4.html#SEC12">4.1 Elementary string checks</a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+<tr><th><a name="INDEX0_1">W</a></th><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_1.html#SEC7">wchar_t, type</a></td><td valign="top"><a href="libunistring_1.html#SEC7">1.6 The <code>wchar_t</code> mess</a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_9.html#SEC37">width</a></td><td valign="top"><a href="libunistring_9.html#SEC37">9. Display width <code>&lt;uniwidth.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_10.html#SEC38">word breaks</a></td><td valign="top"><a href="libunistring_10.html#SEC38">10. Word breaks in strings <code>&lt;uniwbrk.h&gt;</code></a></td></tr>
+<tr><td></td><td valign="top"><a href="libunistring_11.html#SEC41">wrapping</a></td><td valign="top"><a href="libunistring_11.html#SEC41">11. Line breaking <code>&lt;unilbrk.h&gt;</code></a></td></tr>
+<tr><td colspan="3"> <hr></td></tr>
+</table>
+<table><tr><th valign="top">Jump to: &nbsp; </th><td><a href="libunistring_18.html#SEC71_0" class="summary-letter"><b>A</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_1" class="summary-letter"><b>B</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_2" class="summary-letter"><b>C</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_3" class="summary-letter"><b>D</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_4" class="summary-letter"><b>E</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_5" class="summary-letter"><b>F</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_6" class="summary-letter"><b>G</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_7" class="summary-letter"><b>H</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_8" class="summary-letter"><b>I</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_9" class="summary-letter"><b>J</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_10" class="summary-letter"><b>L</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_11" class="summary-letter"><b>M</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_12" class="summary-letter"><b>N</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_13" class="summary-letter"><b>O</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_14" class="summary-letter"><b>P</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_15" class="summary-letter"><b>R</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_16" class="summary-letter"><b>S</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_17" class="summary-letter"><b>T</b></a>
+ &nbsp;
+<a href="libunistring_18.html#SEC71_18" class="summary-letter"><b>U</b></a>
+ &nbsp;
+<a href="#INDEX0_0" class="summary-letter"><b>V</b></a>
+ &nbsp;
+<a href="#INDEX0_1" class="summary-letter"><b>W</b></a>
+ &nbsp;
+</td></tr></table>
+
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[ &gt;&gt; ]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_2.html b/doc/libunistring_2.html
new file mode 100644
index 00000000..6d63b632
--- /dev/null
+++ b/doc/libunistring_2.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: 2. Conventions</title>
+
+<meta name="description" content="GNU libunistring: 2. Conventions">
+<meta name="keywords" content="GNU libunistring: 2. Conventions">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_1.html#SEC1" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_3.html#SEC10" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="Conventions"></a>
+<a name="SEC9"></a>
+<h1 class="chapter"> <a href="libunistring.html#TOC9">2. Conventions</a> </h1>
+
+<p>This chapter explains conventions valid throughout the libunistring library.
+</p>
+<a name="IDX14"></a>
+<p>Variables of type <code>char *</code> denote C strings in locale encoding.
+See <a href="libunistring_1.html#SEC4">Locale encodings</a>.
+</p>
+<p>Variables of type <code>uint8_t *</code> denote UTF-8 strings. Their units
+are bytes.
+</p>
+<p>Variables of type <code>uint16_t *</code> denote UTF-16 strings, without byte
+order mark. Their units are 2-byte words.
+</p>
+<p>Variables of type <code>uint32_t *</code> denote UTF-32 strings, without byte
+order mark. Their units are 4-byte words.
+</p>
+<p>Argument pairs <code>(<var>s</var>, <var>n</var>)</code> denote a string
+<code><var>s</var>[0..<var>n</var>-1]</code> with exactly <var>n</var> units.
+</p>
+<p>All functions with prefix &lsquo;<samp>ulc_</samp>&rsquo; operate on C strings in locale
+encoding.
+</p>
+<p>All functions with prefix &lsquo;<samp>u8_</samp>&rsquo; operate on UTF-8 strings.
+</p>
+<p>All functions with prefix &lsquo;<samp>u16_</samp>&rsquo; operate on UTF-16 strings.
+</p>
+<p>All functions with prefix &lsquo;<samp>u32_</samp>&rsquo; operate on UTF-32 strings.
+</p>
+<p>For every function with prefix &lsquo;<samp>u8_</samp>&rsquo;, operating on UTF-8 strings,
+there is also a corresponding function with prefix &lsquo;<samp>u16_</samp>&rsquo;,
+operating on UTF-16 strings, and a corresponding function with prefix
+&lsquo;<samp>u32_</samp>&rsquo;, operating on UTF-32 strings. Their description is
+analogous; in this documentation we describe only the function that
+operates on UTF-8 strings, for brevity.
+</p>
+<p>A declaration with a variable <var>n</var> denotes the three concrete
+declarations with <var>n</var> = 8, <var>n</var> = 16, <var>n</var> = 32.
+</p>
+<p>All parameters starting with &lsquo;<samp>str</samp>&rsquo; and the parameters of
+functions starting with <code>u8_str</code>/<code>u16_str</code>/<code>u32_str</code>
+denote a NUL terminated string.
+</p>
+<a name="IDX15"></a>
+<p>Error values are always returned through the <code>errno</code> variable,
+usually with a return value that indicates the presence of an error
+(NULL for functions that return an pointer, or -1 for functions that
+return an <code>int</code>).
+</p>
+<p>Functions returning a string result take a
+<code>(<var>resultbuf</var>, <var>lengthp</var>)</code>
+argument pair. If <var>resultbuf</var> is not NULL and the result fits
+into <code>*<var>lengthp</var></code> units, it is put in <var>resultbuf</var>, and
+<var>resultbuf</var> is returned. Otherwise, a freshly allocated string
+is returned. In both cases, <code>*<var>lengthp</var></code> is set to the
+length (number of units) of the returned string. In case of error,
+NULL is returned and <code>errno</code> is set.
+</p>
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_1.html#SEC1" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_3.html#SEC10" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_3.html b/doc/libunistring_3.html
new file mode 100644
index 00000000..cc446970
--- /dev/null
+++ b/doc/libunistring_3.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: 3. Elementary types &lt;unitypes.h&gt;</title>
+
+<meta name="description" content="GNU libunistring: 3. Elementary types &lt;unitypes.h&gt;">
+<meta name="keywords" content="GNU libunistring: 3. Elementary types &lt;unitypes.h&gt;">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_2.html#SEC9" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_4.html#SEC11" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="unitypes_002eh"></a>
+<a name="SEC10"></a>
+<h1 class="chapter"> <a href="libunistring.html#TOC10">3. Elementary types <code>&lt;unitypes.h&gt;</code></a> </h1>
+
+<p>The include file <code>&lt;unitypes.h&gt;</code> provides the following basic types.
+</p>
+<dl>
+<dt><u>Type:</u> <b>uint8_t</b>
+<a name="IDX16"></a>
+</dt>
+<dt><u>Type:</u> <b>uint16_t</b>
+<a name="IDX17"></a>
+</dt>
+<dt><u>Type:</u> <b>uint32_t</b>
+<a name="IDX18"></a>
+</dt>
+<dd><p>These are the storage units of UTF-8/16/32 strings, respectively. The definitions are
+taken from <code>&lt;stdint.h&gt;</code>, on platforms where this include file is present.
+</p></dd></dl>
+
+<dl>
+<dt><u>Type:</u> <b>ucs4_t</b>
+<a name="IDX19"></a>
+</dt>
+<dd><p>This type represents a single Unicode character, outside of an UTF-32 string.
+</p></dd></dl>
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_2.html#SEC9" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_4.html#SEC11" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_4.html b/doc/libunistring_4.html
new file mode 100644
index 00000000..60992cd0
--- /dev/null
+++ b/doc/libunistring_4.html
@@ -0,0 +1,864 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: 4. Elementary Unicode string functions &lt;unistr.h&gt;</title>
+
+<meta name="description" content="GNU libunistring: 4. Elementary Unicode string functions &lt;unistr.h&gt;">
+<meta name="keywords" content="GNU libunistring: 4. Elementary Unicode string functions &lt;unistr.h&gt;">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_3.html#SEC10" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_5.html#SEC17" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="unistr_002eh"></a>
+<a name="SEC11"></a>
+<h1 class="chapter"> <a href="libunistring.html#TOC11">4. Elementary Unicode string functions <code>&lt;unistr.h&gt;</code></a> </h1>
+
+<p>This include file declares elementary functions for Unicode strings. It is
+essentially the equivalent of what <code>&lt;string.h&gt;</code> is for C strings.
+</p>
+
+<hr size="6">
+<a name="Elementary-string-checks"></a>
+<a name="SEC12"></a>
+<h2 class="section"> <a href="libunistring.html#TOC12">4.1 Elementary string checks</a> </h2>
+
+<p>The following function is available to verify the integrity of a Unicode string.
+</p>
+<dl>
+<dt><u>Function:</u> const uint8_t * <b>u8_check</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX20"></a>
+</dt>
+<dt><u>Function:</u> const uint16_t * <b>u16_check</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX21"></a>
+</dt>
+<dt><u>Function:</u> const uint32_t * <b>u32_check</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX22"></a>
+</dt>
+<dd><p>This function checks whether a Unicode string is well-formed.
+It returns NULL if valid, or a pointer to the first invalid unit otherwise.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Elementary-string-conversions"></a>
+<a name="SEC13"></a>
+<h2 class="section"> <a href="libunistring.html#TOC13">4.2 Elementary string conversions</a> </h2>
+
+<p>The following functions perform conversions between the different forms of Unicode strings.
+</p>
+<dl>
+<dt><u>Function:</u> uint16_t * <b>u8_to_u16</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, uint16_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX23"></a>
+</dt>
+<dd><p>Converts an UTF-8 string to an UTF-16 string.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint32_t * <b>u8_to_u32</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, uint32_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX24"></a>
+</dt>
+<dd><p>Converts an UTF-8 string to an UTF-32 string.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u16_to_u8</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, uint8_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX25"></a>
+</dt>
+<dd><p>Converts an UTF-16 string to an UTF-8 string.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint32_t * <b>u16_to_u32</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, uint32_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX26"></a>
+</dt>
+<dd><p>Converts an UTF-16 string to an UTF-32 string.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u32_to_u8</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, uint8_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX27"></a>
+</dt>
+<dd><p>Converts an UTF-32 string to an UTF-8 string.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint16_t * <b>u32_to_u16</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, uint16_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX28"></a>
+</dt>
+<dd><p>Converts an UTF-32 string to an UTF-16 string.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Elementary-string-functions"></a>
+<a name="SEC14"></a>
+<h2 class="section"> <a href="libunistring.html#TOC14">4.3 Elementary string functions</a> </h2>
+
+<p>The following functions inspect and return details about the first character
+in a Unicode string.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>u8_mblen</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX29"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_mblen</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX30"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_mblen</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX31"></a>
+</dt>
+<dd><p>Returns the length (number of units) of the first character in <var>s</var>, which
+is no longer than <var>n</var>. Returns 0 if it is the NUL character. Returns -1
+upon failure.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/mblen.html"><code>mblen</code></a>, except that it operates on a
+Unicode string and that <var>s</var> must not be NULL.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> int <b>u8_mbtouc_unsafe</b><i> (ucs4_t *<var>puc</var>, const uint8_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX32"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_mbtouc_unsafe</b><i> (ucs4_t *<var>puc</var>, const uint16_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX33"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_mbtouc_unsafe</b><i> (ucs4_t *<var>puc</var>, const uint32_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX34"></a>
+</dt>
+<dd><p>Returns the length (number of units) of the first character in <var>s</var>,
+putting its <code>ucs4_t</code> representation in <code>*<var>puc</var></code>. Upon failure,
+<code>*<var>puc</var></code> is set to <code>0xfffd</code>, and an appropriate number of units
+is returned.
+</p>
+<p>The number of available units, <var>n</var>, must be &gt; 0.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/mbtowc.html"><code>mbtowc</code></a>, except that it operates on a
+Unicode string, <var>puc</var> and <var>s</var> must not be NULL, <var>n</var> must be &gt; 0,
+and the NUL character is not treated specially.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> int <b>u8_mbtouc</b><i> (ucs4_t *<var>puc</var>, const uint8_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX35"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_mbtouc</b><i> (ucs4_t *<var>puc</var>, const uint16_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX36"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_mbtouc</b><i> (ucs4_t *<var>puc</var>, const uint32_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX37"></a>
+</dt>
+<dd><p>This function is like <code>u8_mbtouc_unsafe</code>, except that it will detect an
+invalid UTF-8 character, even if the library is compiled without
+&lsquo;<samp>--enable-safety</samp>&rsquo;.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> int <b>u8_mbtoucr</b><i> (ucs4_t *<var>puc</var>, const uint8_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX38"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_mbtoucr</b><i> (ucs4_t *<var>puc</var>, const uint16_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX39"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_mbtoucr</b><i> (ucs4_t *<var>puc</var>, const uint32_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX40"></a>
+</dt>
+<dd><p>Returns the length (number of units) of the first character in <var>s</var>,
+putting its <code>ucs4_t</code> representation in <code>*<var>puc</var></code>. Upon failure,
+<code>*<var>puc</var></code> is set to <code>0xfffd</code>, and -1 is returned for an invalid
+sequence of units, -2 is returned for an incomplete sequence of units.
+</p>
+<p>The number of available units, <var>n</var>, must be &gt; 0.
+</p>
+<p>This function is similar to <code>u8_mbtouc</code>, except that the return value
+gives more details about the failure, similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/mbrtowc.html"><code>mbrtowc</code></a>.
+</p></dd></dl>
+
+<p>The following function stores a Unicode character as a Unicode string in
+memory.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>u8_uctomb</b><i> (uint8_t *<var>s</var>, ucs4_t <var>uc</var>, int <var>n</var>)</i>
+<a name="IDX41"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_uctomb</b><i> (uint16_t *<var>s</var>, ucs4_t <var>uc</var>, int <var>n</var>)</i>
+<a name="IDX42"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_uctomb</b><i> (uint32_t *<var>s</var>, ucs4_t <var>uc</var>, int <var>n</var>)</i>
+<a name="IDX43"></a>
+</dt>
+<dd><p>Puts the multibyte character represented by <var>uc</var> in <var>s</var>, returning its
+length. Returns -1 upon failure, -2 if the number of available units, <var>n</var>,
+is too small. The latter case cannot occur if <var>n</var> &gt;= 6/2/1, respectively.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wctomb.html"><code>wctomb</code></a>, except that it operates on a
+Unicode strings, <var>s</var> must not be NULL, and the argument <var>n</var> must be
+specified.
+</p></dd></dl>
+
+<a name="IDX44"></a>
+<p>The following functions copy Unicode strings in memory.
+</p>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_cpy</b><i> (uint8_t *<var>dest</var>, const uint8_t *<var>src</var>, size_t <var>n</var>)</i>
+<a name="IDX45"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_cpy</b><i> (uint16_t *<var>dest</var>, const uint16_t *<var>src</var>, size_t <var>n</var>)</i>
+<a name="IDX46"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_cpy</b><i> (uint32_t *<var>dest</var>, const uint32_t *<var>src</var>, size_t <var>n</var>)</i>
+<a name="IDX47"></a>
+</dt>
+<dd><p>Copies <var>n</var> units from <var>src</var> to <var>dest</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/memcpy.html"><code>memcpy</code></a>, except that it operates on
+Unicode strings.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_move</b><i> (uint8_t *<var>dest</var>, const uint8_t *<var>src</var>, size_t <var>n</var>)</i>
+<a name="IDX48"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_move</b><i> (uint16_t *<var>dest</var>, const uint16_t *<var>src</var>, size_t <var>n</var>)</i>
+<a name="IDX49"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_move</b><i> (uint32_t *<var>dest</var>, const uint32_t *<var>src</var>, size_t <var>n</var>)</i>
+<a name="IDX50"></a>
+</dt>
+<dd><p>Copies <var>n</var> units from <var>src</var> to <var>dest</var>, guaranteeing correct
+behavior for overlapping memory areas.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/memmove.html"><code>memmove</code></a>, except that it operates on
+Unicode strings.
+</p></dd></dl>
+
+<p>The following function fills a Unicode string.
+</p>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_set</b><i> (uint8_t *<var>s</var>, ucs4_t <var>uc</var>, size_t <var>n</var>)</i>
+<a name="IDX51"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_set</b><i> (uint16_t *<var>s</var>, ucs4_t <var>uc</var>, size_t <var>n</var>)</i>
+<a name="IDX52"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_set</b><i> (uint32_t *<var>s</var>, ucs4_t <var>uc</var>, size_t <var>n</var>)</i>
+<a name="IDX53"></a>
+</dt>
+<dd><p>Sets the first <var>n</var> characters of <var>s</var> to <var>uc</var>. <var>uc</var> should be
+a character that occupies only 1 unit.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/memset.html"><code>memset</code></a>, except that it operates on
+Unicode strings.
+</p></dd></dl>
+
+<a name="IDX54"></a>
+<p>The following function compares two Unicode strings of the same length.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>u8_cmp</b><i> (const uint8_t *<var>s1</var>, const uint8_t *<var>s2</var>, size_t <var>n</var>)</i>
+<a name="IDX55"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_cmp</b><i> (const uint16_t *<var>s1</var>, const uint16_t *<var>s2</var>, size_t <var>n</var>)</i>
+<a name="IDX56"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_cmp</b><i> (const uint32_t *<var>s1</var>, const uint32_t *<var>s2</var>, size_t <var>n</var>)</i>
+<a name="IDX57"></a>
+</dt>
+<dd><p>Compares <var>s1</var> and <var>s2</var>, each of length <var>n</var>, lexicographically.
+Returns a negative value if <var>s1</var> compares smaller than <var>s2</var>,
+a positive value if <var>s1</var> compares larger than <var>s2</var>, or 0 if
+they compare equal.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/memcmp.html"><code>memcmp</code></a>, except that it operates on
+Unicode strings.
+</p></dd></dl>
+
+<p>The following function compares two Unicode strings of possibly different
+lengths.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>u8_cmp2</b><i> (const uint8_t *<var>s1</var>, size_t <var>n1</var>, const uint8_t *<var>s2</var>, size_t <var>n2</var>)</i>
+<a name="IDX58"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_cmp2</b><i> (const uint16_t *<var>s1</var>, size_t <var>n1</var>, const uint16_t *<var>s2</var>, size_t <var>n2</var>)</i>
+<a name="IDX59"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_cmp2</b><i> (const uint32_t *<var>s1</var>, size_t <var>n1</var>, const uint32_t *<var>s2</var>, size_t <var>n2</var>)</i>
+<a name="IDX60"></a>
+</dt>
+<dd><p>Compares <var>s1</var> and <var>s2</var>, lexicographically.
+Returns a negative value if <var>s1</var> compares smaller than <var>s2</var>,
+a positive value if <var>s1</var> compares larger than <var>s2</var>, or 0 if
+they compare equal.
+</p>
+<p>This function is similar to the gnulib function <code>memcmp2</code>, except that it
+operates on Unicode strings.
+</p></dd></dl>
+
+<a name="IDX61"></a>
+<p>The following function searches for a given Unicode character.
+</p>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_chr</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, ucs4_t <var>uc</var>)</i>
+<a name="IDX62"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_chr</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, ucs4_t <var>uc</var>)</i>
+<a name="IDX63"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_chr</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, ucs4_t <var>uc</var>)</i>
+<a name="IDX64"></a>
+</dt>
+<dd><p>Searches the string at <var>s</var> for <var>uc</var>. Returns a pointer to the first
+occurrence of <var>uc</var> in <var>s</var>, or NULL if <var>uc</var> does not occur in
+<var>s</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/memchr.html"><code>memchr</code></a>, except that it operates on
+Unicode strings.
+</p></dd></dl>
+
+<a name="IDX65"></a>
+<p>The following function counts the number of Unicode characters.
+</p>
+<dl>
+<dt><u>Function:</u> size_t <b>u8_mbsnlen</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX66"></a>
+</dt>
+<dt><u>Function:</u> size_t <b>u16_mbsnlen</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX67"></a>
+</dt>
+<dt><u>Function:</u> size_t <b>u32_mbsnlen</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX68"></a>
+</dt>
+<dd><p>Counts and returns the number of Unicode characters in the <var>n</var> units
+from <var>s</var>.
+</p>
+<p>This function is similar to the gnulib function <code>mbsnlen</code>, except that
+it operates on Unicode strings.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Elementary-string-functions-with-memory-allocation"></a>
+<a name="SEC15"></a>
+<h2 class="section"> <a href="libunistring.html#TOC15">4.4 Elementary string functions with memory allocation</a> </h2>
+
+<p>The following function copies a Unicode string.
+</p>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_cpy_alloc</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX69"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_cpy_alloc</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX70"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_cpy_alloc</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>)</i>
+<a name="IDX71"></a>
+</dt>
+<dd><p>Makes a freshly allocated copy of <var>s</var>, of length <var>n</var>.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Elementary-string-functions-on-NUL-terminated-strings"></a>
+<a name="SEC16"></a>
+<h2 class="section"> <a href="libunistring.html#TOC16">4.5 Elementary string functions on NUL terminated strings</a> </h2>
+
+<p>The following functions inspect and return details about the first character
+in a Unicode string.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>u8_strmblen</b><i> (const uint8_t *<var>s</var>)</i>
+<a name="IDX72"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_strmblen</b><i> (const uint16_t *<var>s</var>)</i>
+<a name="IDX73"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_strmblen</b><i> (const uint32_t *<var>s</var>)</i>
+<a name="IDX74"></a>
+</dt>
+<dd><p>Returns the length (number of units) of the first character in <var>s</var>.
+Returns 0 if it is the NUL character. Returns -1 upon failure.
+</p></dd></dl>
+
+<a name="IDX75"></a>
+<dl>
+<dt><u>Function:</u> int <b>u8_strmbtouc</b><i> (ucs4_t *<var>puc</var>, const uint8_t *<var>s</var>)</i>
+<a name="IDX76"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_strmbtouc</b><i> (ucs4_t *<var>puc</var>, const uint16_t *<var>s</var>)</i>
+<a name="IDX77"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_strmbtouc</b><i> (ucs4_t *<var>puc</var>, const uint32_t *<var>s</var>)</i>
+<a name="IDX78"></a>
+</dt>
+<dd><p>Returns the length (number of units) of the first character in <var>s</var>,
+putting its <code>ucs4_t</code> representation in <code>*<var>puc</var></code>. Returns 0
+if it is the NUL character. Returns -1 upon failure.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> const uint8_t * <b>u8_next</b><i> (ucs4_t *<var>puc</var>, const uint8_t *<var>s</var>)</i>
+<a name="IDX79"></a>
+</dt>
+<dt><u>Function:</u> const uint16_t * <b>u16_next</b><i> (ucs4_t *<var>puc</var>, const uint16_t *<var>s</var>)</i>
+<a name="IDX80"></a>
+</dt>
+<dt><u>Function:</u> const uint32_t * <b>u32_next</b><i> (ucs4_t *<var>puc</var>, const uint32_t *<var>s</var>)</i>
+<a name="IDX81"></a>
+</dt>
+<dd><p>Forward iteration step. Advances the pointer past the next character,
+or returns NULL if the end of the string has been reached. Puts the
+character's <code>ucs4_t</code> representation in <code>*<var>puc</var></code>.
+</p></dd></dl>
+
+<p>The following function inspects and returns details about the previous
+character in a Unicode string.
+</p>
+<dl>
+<dt><u>Function:</u> const uint8_t * <b>u8_prev</b><i> (ucs4_t *<var>puc</var>, const uint8_t *<var>s</var>, const uint8_t *<var>start</var>)</i>
+<a name="IDX82"></a>
+</dt>
+<dt><u>Function:</u> const uint16_t * <b>u16_prev</b><i> (ucs4_t *<var>puc</var>, const uint16_t *<var>s</var>, const uint16_t *<var>start</var>)</i>
+<a name="IDX83"></a>
+</dt>
+<dt><u>Function:</u> const uint32_t * <b>u32_prev</b><i> (ucs4_t *<var>puc</var>, const uint32_t *<var>s</var>, const uint32_t *<var>start</var>)</i>
+<a name="IDX84"></a>
+</dt>
+<dd><p>Backward iteration step. Advances the pointer to point to the previous
+character, or returns NULL if the beginning of the string had been reached.
+Puts the character's <code>ucs4_t</code> representation in <code>*<var>puc</var></code>.
+</p></dd></dl>
+
+<p>The following functions determine the length of a Unicode string.
+</p>
+<dl>
+<dt><u>Function:</u> size_t <b>u8_strlen</b><i> (const uint8_t *<var>s</var>)</i>
+<a name="IDX85"></a>
+</dt>
+<dt><u>Function:</u> size_t <b>u16_strlen</b><i> (const uint16_t *<var>s</var>)</i>
+<a name="IDX86"></a>
+</dt>
+<dt><u>Function:</u> size_t <b>u32_strlen</b><i> (const uint32_t *<var>s</var>)</i>
+<a name="IDX87"></a>
+</dt>
+<dd><p>Returns the number of units in <var>s</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strlen.html"><code>strlen</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wcslen.html"><code>wcslen</code></a>, except
+that it operates on Unicode strings.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> size_t <b>u8_strnlen</b><i> (const uint8_t *<var>s</var>, size_t <var>maxlen</var>)</i>
+<a name="IDX88"></a>
+</dt>
+<dt><u>Function:</u> size_t <b>u16_strnlen</b><i> (const uint16_t *<var>s</var>, size_t <var>maxlen</var>)</i>
+<a name="IDX89"></a>
+</dt>
+<dt><u>Function:</u> size_t <b>u32_strnlen</b><i> (const uint32_t *<var>s</var>, size_t <var>maxlen</var>)</i>
+<a name="IDX90"></a>
+</dt>
+<dd><p>Returns the number of units in <var>s</var>, but at most <var>maxlen</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strnlen.html"><code>strnlen</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wcsnlen.html"><code>wcsnlen</code></a>, except
+that it operates on Unicode strings.
+</p></dd></dl>
+
+<a name="IDX91"></a>
+<p>The following functions copy portions of Unicode strings in memory.
+</p>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_strcpy</b><i> (uint8_t *<var>dest</var>, const uint8_t *<var>src</var>)</i>
+<a name="IDX92"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_strcpy</b><i> (uint16_t *<var>dest</var>, const uint16_t *<var>src</var>)</i>
+<a name="IDX93"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_strcpy</b><i> (uint32_t *<var>dest</var>, const uint32_t *<var>src</var>)</i>
+<a name="IDX94"></a>
+</dt>
+<dd><p>Copies <var>src</var> to <var>dest</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strcpy.html"><code>strcpy</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wcscpy.html"><code>wcscpy</code></a>, except
+that it operates on Unicode strings.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_stpcpy</b><i> (uint8_t *<var>dest</var>, const uint8_t *<var>src</var>)</i>
+<a name="IDX95"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_stpcpy</b><i> (uint16_t *<var>dest</var>, const uint16_t *<var>src</var>)</i>
+<a name="IDX96"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_stpcpy</b><i> (uint32_t *<var>dest</var>, const uint32_t *<var>src</var>)</i>
+<a name="IDX97"></a>
+</dt>
+<dd><p>Copies <var>src</var> to <var>dest</var>, returning the address of the terminating NUL
+in <var>dest</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/stpcpy.html"><code>stpcpy</code></a>, except that it operates on
+Unicode strings.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_strncpy</b><i> (uint8_t *<var>dest</var>, const uint8_t *<var>src</var>, size_t <var>n</var>)</i>
+<a name="IDX98"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_strncpy</b><i> (uint16_t *<var>dest</var>, const uint16_t *<var>src</var>, size_t <var>n</var>)</i>
+<a name="IDX99"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_strncpy</b><i> (uint32_t *<var>dest</var>, const uint32_t *<var>src</var>, size_t <var>n</var>)</i>
+<a name="IDX100"></a>
+</dt>
+<dd><p>Copies no more than <var>n</var> units of <var>src</var> to <var>dest</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strncpy.html"><code>strncpy</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wcsncpy.html"><code>wcsncpy</code></a>, except
+that it operates on Unicode strings.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_stpncpy</b><i> (uint8_t *<var>dest</var>, const uint8_t *<var>src</var>, size_t <var>n</var>)</i>
+<a name="IDX101"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_stpncpy</b><i> (uint16_t *<var>dest</var>, const uint16_t *<var>src</var>, size_t <var>n</var>)</i>
+<a name="IDX102"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_stpncpy</b><i> (uint32_t *<var>dest</var>, const uint32_t *<var>src</var>, size_t <var>n</var>)</i>
+<a name="IDX103"></a>
+</dt>
+<dd><p>Copies no more than <var>n</var> units of <var>src</var> to <var>dest</var>, returning the
+address of the last unit written into <var>dest</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/stpncpy.html"><code>stpncpy</code></a>, except that it operates on
+Unicode strings.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_strcat</b><i> (uint8_t *<var>dest</var>, const uint8_t *<var>src</var>)</i>
+<a name="IDX104"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_strcat</b><i> (uint16_t *<var>dest</var>, const uint16_t *<var>src</var>)</i>
+<a name="IDX105"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_strcat</b><i> (uint32_t *<var>dest</var>, const uint32_t *<var>src</var>)</i>
+<a name="IDX106"></a>
+</dt>
+<dd><p>Appends <var>src</var> onto <var>dest</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strcat.html"><code>strcat</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wcscat.html"><code>wcscat</code></a>, except
+that it operates on Unicode strings.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_strncat</b><i> (uint8_t *<var>dest</var>, const uint8_t *<var>src</var>, size_t <var>n</var>)</i>
+<a name="IDX107"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_strncat</b><i> (uint16_t *<var>dest</var>, const uint16_t *<var>src</var>, size_t <var>n</var>)</i>
+<a name="IDX108"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_strncat</b><i> (uint32_t *<var>dest</var>, const uint32_t *<var>src</var>, size_t <var>n</var>)</i>
+<a name="IDX109"></a>
+</dt>
+<dd><p>Appends no more than <var>n</var> units of <var>src</var> onto <var>dest</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strncat.html"><code>strncat</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wcsncat.html"><code>wcsncat</code></a>, except
+that it operates on Unicode strings.
+</p></dd></dl>
+
+<a name="IDX110"></a>
+<p>The following functions compare two Unicode strings.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>u8_strcmp</b><i> (const uint8_t *<var>s1</var>, const uint8_t *<var>s2</var>)</i>
+<a name="IDX111"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_strcmp</b><i> (const uint16_t *<var>s1</var>, const uint16_t *<var>s2</var>)</i>
+<a name="IDX112"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_strcmp</b><i> (const uint32_t *<var>s1</var>, const uint32_t *<var>s2</var>)</i>
+<a name="IDX113"></a>
+</dt>
+<dd><p>Compares <var>s1</var> and <var>s2</var>, lexicographically.
+Returns a negative value if <var>s1</var> compares smaller than <var>s2</var>,
+a positive value if <var>s1</var> compares larger than <var>s2</var>, or 0 if
+they compare equal.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strcmp.html"><code>strcmp</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wcscmp.html"><code>wcscmp</code></a>, except
+that it operates on Unicode strings.
+</p></dd></dl>
+
+<a name="IDX114"></a>
+<dl>
+<dt><u>Function:</u> int <b>u8_strcoll</b><i> (const uint8_t *<var>s1</var>, const uint8_t *<var>s2</var>)</i>
+<a name="IDX115"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_strcoll</b><i> (const uint16_t *<var>s1</var>, const uint16_t *<var>s2</var>)</i>
+<a name="IDX116"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_strcoll</b><i> (const uint32_t *<var>s1</var>, const uint32_t *<var>s2</var>)</i>
+<a name="IDX117"></a>
+</dt>
+<dd><p>Compares <var>s1</var> and <var>s2</var> using the collation rules of the current
+locale.
+Returns -1 if <var>s1</var> &lt; <var>s2</var>, 0 if <var>s1</var> = <var>s2</var>, 1 if
+<var>s1</var> &gt; <var>s2</var>. Upon failure, sets <code>errno</code> and returns any value.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strcoll.html"><code>strcoll</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wcscoll.html"><code>wcscoll</code></a>, except
+that it operates on Unicode strings.
+</p>
+<p>Note that this function may consider different canonical normalizations
+of the same string as having a large distance. It is therefore better to
+use the function <code>u8_normcoll</code> instead of this one; see <a href="libunistring_12.html#SEC42">Normalization forms (composition and decomposition) <code>&lt;uninorm.h&gt;</code></a>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> int <b>u8_strncmp</b><i> (const uint8_t *<var>s1</var>, const uint8_t *<var>s2</var>, size_t <var>n</var>)</i>
+<a name="IDX118"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_strncmp</b><i> (const uint16_t *<var>s1</var>, const uint16_t *<var>s2</var>, size_t <var>n</var>)</i>
+<a name="IDX119"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_strncmp</b><i> (const uint32_t *<var>s1</var>, const uint32_t *<var>s2</var>, size_t <var>n</var>)</i>
+<a name="IDX120"></a>
+</dt>
+<dd><p>Compares no more than <var>n</var> units of <var>s1</var> and <var>s2</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strncmp.html"><code>strncmp</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wcsncmp.html"><code>wcsncmp</code></a>, except
+that it operates on Unicode strings.
+</p></dd></dl>
+
+<a name="IDX121"></a>
+<p>The following function allocates a duplicate of a Unicode string.
+</p>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_strdup</b><i> (const uint8_t *<var>s</var>)</i>
+<a name="IDX122"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_strdup</b><i> (const uint16_t *<var>s</var>)</i>
+<a name="IDX123"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_strdup</b><i> (const uint32_t *<var>s</var>)</i>
+<a name="IDX124"></a>
+</dt>
+<dd><p>Duplicates <var>s</var>, returning an identical malloc'd string.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strdup.html"><code>strdup</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wcsdup.html"><code>wcsdup</code></a>, except
+that it operates on Unicode strings.
+</p></dd></dl>
+
+<a name="IDX125"></a>
+<p>The following functions search for a given Unicode character.
+</p>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_strchr</b><i> (const uint8_t *<var>str</var>, ucs4_t <var>uc</var>)</i>
+<a name="IDX126"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_strchr</b><i> (const uint16_t *<var>str</var>, ucs4_t <var>uc</var>)</i>
+<a name="IDX127"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_strchr</b><i> (const uint32_t *<var>str</var>, ucs4_t <var>uc</var>)</i>
+<a name="IDX128"></a>
+</dt>
+<dd><p>Finds the first occurrence of <var>uc</var> in <var>str</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strchr.html"><code>strchr</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wcschr.html"><code>wcschr</code></a>, except
+that it operates on Unicode strings.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_strrchr</b><i> (const uint8_t *<var>str</var>, ucs4_t <var>uc</var>)</i>
+<a name="IDX129"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_strrchr</b><i> (const uint16_t *<var>str</var>, ucs4_t <var>uc</var>)</i>
+<a name="IDX130"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_strrchr</b><i> (const uint32_t *<var>str</var>, ucs4_t <var>uc</var>)</i>
+<a name="IDX131"></a>
+</dt>
+<dd><p>Finds the last occurrence of <var>uc</var> in <var>str</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strrchr.html"><code>strrchr</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wcsrchr.html"><code>wcsrchr</code></a>, except
+that it operates on Unicode strings.
+</p></dd></dl>
+
+<p>The following functions search for the first occurrence of some Unicode
+character in or outside a given set of Unicode characters.
+</p>
+<dl>
+<dt><u>Function:</u> size_t <b>u8_strcspn</b><i> (const uint8_t *<var>str</var>, const uint8_t *<var>reject</var>)</i>
+<a name="IDX132"></a>
+</dt>
+<dt><u>Function:</u> size_t <b>u16_strcspn</b><i> (const uint16_t *<var>str</var>, const uint16_t *<var>reject</var>)</i>
+<a name="IDX133"></a>
+</dt>
+<dt><u>Function:</u> size_t <b>u32_strcspn</b><i> (const uint32_t *<var>str</var>, const uint32_t *<var>reject</var>)</i>
+<a name="IDX134"></a>
+</dt>
+<dd><p>Returns the length of the initial segment of <var>str</var> which consists entirely
+of Unicode characters not in <var>reject</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strcspn.html"><code>strcspn</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wcscspn.html"><code>wcscspn</code></a>, except
+that it operates on Unicode strings.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> size_t <b>u8_strspn</b><i> (const uint8_t *<var>str</var>, const uint8_t *<var>accept</var>)</i>
+<a name="IDX135"></a>
+</dt>
+<dt><u>Function:</u> size_t <b>u16_strspn</b><i> (const uint16_t *<var>str</var>, const uint16_t *<var>accept</var>)</i>
+<a name="IDX136"></a>
+</dt>
+<dt><u>Function:</u> size_t <b>u32_strspn</b><i> (const uint32_t *<var>str</var>, const uint32_t *<var>accept</var>)</i>
+<a name="IDX137"></a>
+</dt>
+<dd><p>Returns the length of the initial segment of <var>str</var> which consists entirely
+of Unicode characters in <var>accept</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strspn.html"><code>strspn</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wcsspn.html"><code>wcsspn</code></a>, except
+that it operates on Unicode strings.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_strpbrk</b><i> (const uint8_t *<var>str</var>, const uint8_t *<var>accept</var>)</i>
+<a name="IDX138"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_strpbrk</b><i> (const uint16_t *<var>str</var>, const uint16_t *<var>accept</var>)</i>
+<a name="IDX139"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_strpbrk</b><i> (const uint32_t *<var>str</var>, const uint32_t *<var>accept</var>)</i>
+<a name="IDX140"></a>
+</dt>
+<dd><p>Finds the first occurrence in <var>str</var> of any character in <var>accept</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strpbrk.html"><code>strpbrk</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wcspbrk.html"><code>wcspbrk</code></a>, except
+that it operates on Unicode strings.
+</p></dd></dl>
+
+<a name="IDX141"></a>
+<p>The following functions search whether a given Unicode string is a substring
+of another Unicode string.
+</p>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_strstr</b><i> (const uint8_t *<var>haystack</var>, const uint8_t *<var>needle</var>)</i>
+<a name="IDX142"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_strstr</b><i> (const uint16_t *<var>haystack</var>, const uint16_t *<var>needle</var>)</i>
+<a name="IDX143"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_strstr</b><i> (const uint32_t *<var>haystack</var>, const uint32_t *<var>needle</var>)</i>
+<a name="IDX144"></a>
+</dt>
+<dd><p>Finds the first occurrence of <var>needle</var> in <var>haystack</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strstr.html"><code>strstr</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wcsstr.html"><code>wcsstr</code></a>, except
+that it operates on Unicode strings.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>u8_startswith</b><i> (const uint8_t *<var>str</var>, const uint8_t *<var>prefix</var>)</i>
+<a name="IDX145"></a>
+</dt>
+<dt><u>Function:</u> bool <b>u16_startswith</b><i> (const uint16_t *<var>str</var>, const uint16_t *<var>prefix</var>)</i>
+<a name="IDX146"></a>
+</dt>
+<dt><u>Function:</u> bool <b>u32_startswith</b><i> (const uint32_t *<var>str</var>, const uint32_t *<var>prefix</var>)</i>
+<a name="IDX147"></a>
+</dt>
+<dd><p>Tests whether <var>str</var> starts with <var>prefix</var>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>u8_endswith</b><i> (const uint8_t *<var>str</var>, const uint8_t *<var>suffix</var>)</i>
+<a name="IDX148"></a>
+</dt>
+<dt><u>Function:</u> bool <b>u16_endswith</b><i> (const uint16_t *<var>str</var>, const uint16_t *<var>suffix</var>)</i>
+<a name="IDX149"></a>
+</dt>
+<dt><u>Function:</u> bool <b>u32_endswith</b><i> (const uint32_t *<var>str</var>, const uint32_t *<var>suffix</var>)</i>
+<a name="IDX150"></a>
+</dt>
+<dd><p>Tests whether <var>str</var> ends with <var>suffix</var>.
+</p></dd></dl>
+
+<p>The following function does one step in tokenizing a Unicode string.
+</p>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_strtok</b><i> (uint8_t *<var>str</var>, const uint8_t *<var>delim</var>, uint8_t **<var>ptr</var>)</i>
+<a name="IDX151"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_strtok</b><i> (uint16_t *<var>str</var>, const uint16_t *<var>delim</var>, uint16_t **<var>ptr</var>)</i>
+<a name="IDX152"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_strtok</b><i> (uint32_t *<var>str</var>, const uint32_t *<var>delim</var>, uint32_t **<var>ptr</var>)</i>
+<a name="IDX153"></a>
+</dt>
+<dd><p>Divides <var>str</var> into tokens separated by characters in <var>delim</var>.
+</p>
+<p>This function is similar to <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/strtok_r.html"><code>strtok_r</code></a> and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/wcstok.html"><code>wcstok</code></a>, except
+that it operates on Unicode strings. Its interface is actually more similar to
+<code>wcstok</code> than to <code>strtok</code>.
+</p></dd></dl>
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC11" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_5.html#SEC17" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_5.html b/doc/libunistring_5.html
new file mode 100644
index 00000000..92e115f9
--- /dev/null
+++ b/doc/libunistring_5.html
@@ -0,0 +1,296 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: 5. Conversions between Unicode and encodings &lt;uniconv.h&gt;</title>
+
+<meta name="description" content="GNU libunistring: 5. Conversions between Unicode and encodings &lt;uniconv.h&gt;">
+<meta name="keywords" content="GNU libunistring: 5. Conversions between Unicode and encodings &lt;uniconv.h&gt;">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_4.html#SEC11" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_6.html#SEC18" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="uniconv_002eh"></a>
+<a name="SEC17"></a>
+<h1 class="chapter"> <a href="libunistring.html#TOC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a> </h1>
+
+<p>This include file declares functions for converting between Unicode strings
+and <code>char *</code> strings in locale encoding or in other specified encodings.
+</p>
+<a name="IDX154"></a>
+<p>The following function returns the locale encoding.
+</p>
+<dl>
+<dt><u>Function:</u> const char * <b>locale_charset</b><i> ()</i>
+<a name="IDX155"></a>
+</dt>
+<dd><p>Determines the current locale's character encoding, and canonicalizes it
+into one of the canonical names listed in &lsquo;<tt>config.charset</tt>&rsquo;.
+If the canonical name cannot be determined, the result is a non-canonical
+name.
+</p>
+<p>The result must not be freed; it is statically allocated.
+</p>
+<p>The result of this function can be used as an argument to the <code>iconv_open</code>
+function in GNU libc, in GNU libiconv, or in the gnulib provided wrapper
+around the native <code>iconv_open</code> function. It may not work as an argument
+to the native <code>iconv_open</code> function directly.
+</p></dd></dl>
+
+<p>The handling of unconvertible characters during the conversions can be
+parametrized through the following enumeration type:
+</p>
+<dl>
+<dt><u>Type:</u> <b>enum iconv_ilseq_handler</b>
+<a name="IDX156"></a>
+</dt>
+<dd><p>This type specifies how unconvertible characters in the input are handled.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> enum iconv_ilseq_handler <b>iconveh_error</b>
+<a name="IDX157"></a>
+</dt>
+<dd><p>This handler causes the function to return with <code>errno</code> set to
+<code>EILSEQ</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> enum iconv_ilseq_handler <b>iconveh_question_mark</b>
+<a name="IDX158"></a>
+</dt>
+<dd><p>This handler produces one question mark &lsquo;<samp>?</samp>&rsquo; per unconvertible character.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> enum iconv_ilseq_handler <b>iconveh_escape_sequence</b>
+<a name="IDX159"></a>
+</dt>
+<dd><p>This handler produces an escape sequence <code>\u<var>xxxx</var></code> or
+<code>\U<var>xxxxxxxx</var></code> for each unconvertible character.
+</p></dd></dl>
+
+<a name="IDX160"></a>
+<p>The following functions convert between strings in a specified encoding and
+Unicode strings.
+</p>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_conv_from_encoding</b><i> (const char *<var>fromcode</var>, enum iconv_ilseq_handler <var>handler</var>, const char *<var>src</var>, size_t <var>srclen</var>, size_t *<var>offsets</var>, uint8_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX161"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_conv_from_encoding</b><i> (const char *<var>fromcode</var>, enum iconv_ilseq_handler <var>handler</var>, const char *<var>src</var>, size_t <var>srclen</var>, size_t *<var>offsets</var>, uint16_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX162"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_conv_from_encoding</b><i> (const char *<var>fromcode</var>, enum iconv_ilseq_handler <var>handler</var>, const char *<var>src</var>, size_t <var>srclen</var>, size_t *<var>offsets</var>, uint32_t *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX163"></a>
+</dt>
+<dd><p>Converts an entire string, possibly including NUL bytes, from one encoding
+to UTF-8 encoding.
+</p>
+<p>Converts a memory region given in encoding <var>fromcode</var>. <var>fromcode</var> is
+as for the <code>iconv_open</code> function.
+</p>
+<p>The input is in the memory region between <var>src</var> (inclusive) and
+<code><var>src</var> + <var>srclen</var></code> (exclusive).
+</p>
+<p>If <var>offsets</var> is not NULL, it should point to an array of <var>srclen</var>
+integers; this array is filled with offsets into the result, i.e. the
+character starting at <code><var>src</var>[i]</code> corresponds to the character starting
+at <code><var>result</var>[<var>offsets</var>[i]]</code>, and other offsets are set to
+<code>(size_t)(-1)</code>.
+</p>
+<p><code><var>resultbuf</var></code> and <code>*<var>lengthp</var></code> should be a scratch
+buffer and its size, or <code><var>resultbuf</var></code> can be NULL.
+</p>
+<p>May erase the contents of the memory at <code><var>resultbuf</var></code>.
+</p>
+<p>If successful: The resulting Unicode string (non-NULL) is returned and
+its length stored in <code>*<var>lengthp</var></code>. The resulting string is
+<code><var>resultbuf</var></code> if no dynamic memory allocation was necessary,
+or a freshly allocated memory block otherwise.
+</p>
+<p>In case of error: NULL is returned and <code>errno</code> is set.
+Particular <code>errno</code> values: <code>EINVAL</code>, <code>EILSEQ</code>, <code>ENOMEM</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> char * <b>u8_conv_to_encoding</b><i> (const char *<var>tocode</var>, enum iconv_ilseq_handler <var>handler</var>, const uint8_t *<var>src</var>, size_t <var>srclen</var>, size_t *<var>offsets</var>, char *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX164"></a>
+</dt>
+<dt><u>Function:</u> char * <b>u16_conv_to_encoding</b><i> (const char *<var>tocode</var>, enum iconv_ilseq_handler <var>handler</var>, const uint16_t *<var>src</var>, size_t <var>srclen</var>, size_t *<var>offsets</var>, char *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX165"></a>
+</dt>
+<dt><u>Function:</u> char * <b>u32_conv_to_encoding</b><i> (const char *<var>tocode</var>, enum iconv_ilseq_handler <var>handler</var>, const uint32_t *<var>src</var>, size_t <var>srclen</var>, size_t *<var>offsets</var>, char *<var>resultbuf</var>, size_t *<var>lengthp</var>)</i>
+<a name="IDX166"></a>
+</dt>
+<dd><p>Converts an entire Unicode string, possibly including NUL units, from UTF-8
+encoding to a given encoding.
+</p>
+<p>Converts a memory region to encoding <var>tocode</var>. <var>tocode</var> is as for
+the <code>iconv_open</code> function.
+</p>
+<p>The input is in the memory region between <var>src</var> (inclusive) and
+<code><var>src</var> + <var>srclen</var></code> (exclusive).
+</p>
+<p>If <var>offsets</var> is not NULL, it should point to an array of <var>srclen</var>
+integers; this array is filled with offsets into the result, i.e. the
+character starting at <code><var>src</var>[i]</code> corresponds to the character starting
+at <code><var>result</var>[<var>offsets</var>[i]]</code>, and other offsets are set to
+<code>(size_t)(-1)</code>.
+</p>
+<p><code><var>resultbuf</var></code> and <code>*<var>lengthp</var></code> should be a scratch
+buffer and its size, or <code><var>resultbuf</var></code> can be NULL.
+</p>
+<p>May erase the contents of the memory at <code><var>resultbuf</var></code>.
+</p>
+<p>If successful: The resulting Unicode string (non-NULL) is returned and
+its length stored in <code>*<var>lengthp</var></code>. The resulting string is
+<code><var>resultbuf</var></code> if no dynamic memory allocation was necessary,
+or a freshly allocated memory block otherwise.
+</p>
+<p>In case of error: NULL is returned and <code>errno</code> is set.
+Particular <code>errno</code> values: <code>EINVAL</code>, <code>EILSEQ</code>, <code>ENOMEM</code>.
+</p></dd></dl>
+
+<p>The following functions convert between NUL terminated strings in a specified
+encoding and NUL terminated Unicode strings.
+</p>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_strconv_from_encoding</b><i> (const char *<var>string</var>, const char *<var>fromcode</var>, enum iconv_ilseq_handler <var>handler</var>)</i>
+<a name="IDX167"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_strconv_from_encoding</b><i> (const char *<var>string</var>, const char *<var>fromcode</var>, enum iconv_ilseq_handler <var>handler</var>)</i>
+<a name="IDX168"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_strconv_from_encoding</b><i> (const char *<var>string</var>, const char *<var>fromcode</var>, enum iconv_ilseq_handler <var>handler</var>)</i>
+<a name="IDX169"></a>
+</dt>
+<dd><p>Converts a NUL terminated string from a given encoding.
+</p>
+<p>The result is <code>malloc</code> allocated, or NULL (with <var>errno</var> set) in case of error.
+</p>
+<p>Particular <code>errno</code> values: <code>EILSEQ</code>, <code>ENOMEM</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> char * <b>u8_strconv_to_encoding</b><i> (const uint8_t *<var>string</var>, const char *<var>tocode</var>, enum iconv_ilseq_handler <var>handler</var>)</i>
+<a name="IDX170"></a>
+</dt>
+<dt><u>Function:</u> char * <b>u16_strconv_to_encoding</b><i> (const uint16_t *<var>string</var>, const char *<var>tocode</var>, enum iconv_ilseq_handler <var>handler</var>)</i>
+<a name="IDX171"></a>
+</dt>
+<dt><u>Function:</u> char * <b>u32_strconv_to_encoding</b><i> (const uint32_t *<var>string</var>, const char *<var>tocode</var>, enum iconv_ilseq_handler <var>handler</var>)</i>
+<a name="IDX172"></a>
+</dt>
+<dd><p>Converts a NUL terminated string to a given encoding.
+</p>
+<p>The result is <code>malloc</code> allocated, or NULL (with <code>errno</code> set) in case of error.
+</p>
+<p>Particular <code>errno</code> values: <code>EILSEQ</code>, <code>ENOMEM</code>.
+</p></dd></dl>
+
+<p>The following functions are shorthands that convert between NUL terminated
+strings in locale encoding and NUL terminated Unicode strings.
+</p>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_strconv_from_locale</b><i> (const char *<var>string</var>)</i>
+<a name="IDX173"></a>
+</dt>
+<dt><u>Function:</u> uint16_t * <b>u16_strconv_from_locale</b><i> (const char *<var>string</var>)</i>
+<a name="IDX174"></a>
+</dt>
+<dt><u>Function:</u> uint32_t * <b>u32_strconv_from_locale</b><i> (const char *<var>string</var>)</i>
+<a name="IDX175"></a>
+</dt>
+<dd><p>Converts a NUL terminated string from the locale encoding.
+</p>
+<p>The result is <code>malloc</code> allocated, or NULL (with <code>errno</code> set) in case of error.
+</p>
+<p>Particular <code>errno</code> values: <code>ENOMEM</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> char * <b>u8_strconv_to_locale</b><i> (const uint8_t *<var>string</var>)</i>
+<a name="IDX176"></a>
+</dt>
+<dt><u>Function:</u> char * <b>u16_strconv_to_locale</b><i> (const uint16_t *<var>string</var>)</i>
+<a name="IDX177"></a>
+</dt>
+<dt><u>Function:</u> char * <b>u32_strconv_to_locale</b><i> (const uint32_t *<var>string</var>)</i>
+<a name="IDX178"></a>
+</dt>
+<dd><p>Converts a NUL terminated string to the locale encoding.
+</p>
+<p>The result is <code>malloc</code> allocated, or NULL (with <code>errno</code> set) in case of error.
+</p>
+<p>Particular <code>errno</code> values: <code>ENOMEM</code>.
+</p></dd></dl>
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_4.html#SEC11" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_6.html#SEC18" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_6.html b/doc/libunistring_6.html
new file mode 100644
index 00000000..33cda594
--- /dev/null
+++ b/doc/libunistring_6.html
@@ -0,0 +1,451 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: 6. Output with Unicode strings &lt;unistdio.h&gt;</title>
+
+<meta name="description" content="GNU libunistring: 6. Output with Unicode strings &lt;unistdio.h&gt;">
+<meta name="keywords" content="GNU libunistring: 6. Output with Unicode strings &lt;unistdio.h&gt;">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_5.html#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_7.html#SEC19" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="unistdio_002eh"></a>
+<a name="SEC18"></a>
+<h1 class="chapter"> <a href="libunistring.html#TOC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a> </h1>
+
+<p>This include file declares functions for doing formatted output with Unicode
+strings. It defines a set of functions similar to <code>fprintf</code> and
+<code>sprintf</code>, which are declared in <code>&lt;stdio.h&gt;</code>.
+</p>
+<p>These functions work like the <code>printf</code> function family.
+In the format string:
+</p><ul class="toc">
+<li>
+The format directive &lsquo;<samp>U</samp>&rsquo; takes an UTF-8 string (<code>const uint8_t *</code>).
+</li><li>
+The format directive &lsquo;<samp>lU</samp>&rsquo; takes an UTF-16 string
+(<code>const uint16_t *</code>).
+</li><li>
+The format directive &lsquo;<samp>llU</samp>&rsquo; takes an UTF-32 string
+(<code>const uint32_t *</code>).
+</li></ul>
+
+<p>A function name with an infix &lsquo;<samp>v</samp>&rsquo; indicates that a <code>va_list</code> is
+passed instead of multiple arguments.
+</p>
+<p>The functions <code>*sprintf</code> have a <var>buf</var> argument that is assumed to be
+large enough.
+(<em>DANGEROUS! Overflowing the buffer will crash the program.</em>)
+</p>
+<p>The functions <code>*snprintf</code> have a <var>buf</var> argument that is assumed to be
+<var>size</var> units large. (<em>DANGEROUS! The resulting string might be
+truncated in the middle of a multibyte character.</em>)
+</p>
+<p>The functions <code>*asprintf</code> have a <var>resultp</var> argument. The result will
+be freshly allocated and stored in <code>*resultp</code>.
+</p>
+<p>The functions <code>*asnprintf</code> have a (<var>resultbuf</var>, <var>lengthp</var>)
+argument pair. If <var>resultbuf</var> is not NULL and the result fits into
+<code>*<var>lengthp</var></code> units, it is put in <var>resultbuf</var>, and <var>resultbuf</var>
+is returned. Otherwise, a freshly allocated string is returned. In both
+cases, <code>*<var>lengthp</var></code> is set to the length (number of units) of the
+returned string. In case of error, NULL is returned and <code>errno</code> is set.
+</p>
+<p>The following functions take an ASCII format string and return a result that
+is a <code>char *</code> string in locale encoding.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>ulc_sprintf</b><i> (char *<var>buf</var>, const char *<var>format</var>, ...)</i>
+<a name="IDX179"></a>
+</dt>
+</dl>
+
+<dl>
+<dt><u>Function:</u> int <b>ulc_snprintf</b><i> (char *<var>buf</var>, size_t size, const char *<var>format</var>, ...)</i>
+<a name="IDX180"></a>
+</dt>
+</dl>
+
+<dl>
+<dt><u>Function:</u> int <b>ulc_asprintf</b><i> (char **<var>resultp</var>, const char *<var>format</var>, ...)</i>
+<a name="IDX181"></a>
+</dt>
+</dl>
+
+<dl>
+<dt><u>Function:</u> char * <b>ulc_asnprintf</b><i> (char *<var>resultbuf</var>, size_t *<var>lengthp</var>, const char *<var>format</var>, ...)</i>
+<a name="IDX182"></a>
+</dt>
+</dl>
+
+<dl>
+<dt><u>Function:</u> int <b>ulc_vsprintf</b><i> (char *<var>buf</var>, const char *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX183"></a>
+</dt>
+</dl>
+
+<dl>
+<dt><u>Function:</u> int <b>ulc_vsnprintf</b><i> (char *<var>buf</var>, size_t size, const char *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX184"></a>
+</dt>
+</dl>
+
+<dl>
+<dt><u>Function:</u> int <b>ulc_vasprintf</b><i> (char **<var>resultp</var>, const char *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX185"></a>
+</dt>
+</dl>
+
+<dl>
+<dt><u>Function:</u> char * <b>ulc_vasnprintf</b><i> (char *<var>resultbuf</var>, size_t *<var>lengthp</var>, const char *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX186"></a>
+</dt>
+</dl>
+
+<p>The following functions take an ASCII format string and return a result in
+UTF-8 format.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>u8_sprintf</b><i> (uint8_t *<var>buf</var>, const char *<var>format</var>, ...)</i>
+<a name="IDX187"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u8_snprintf</b><i> (uint8_t *<var>buf</var>, size_t <var>size</var>, const char *<var>format</var>, ...)</i>
+<a name="IDX188"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u8_asprintf</b><i> (uint8_t **<var>resultp</var>, const char *<var>format</var>, ...)</i>
+<a name="IDX189"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_asnprintf</b><i> (uint8_t *<var>resultbuf</var>, size_t *<var>lengthp</var>, const char *<var>format</var>, ...)</i>
+<a name="IDX190"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u8_vsprintf</b><i> (uint8_t *<var>buf</var>, const char *<var>format</var>, va_list ap)</i>
+<a name="IDX191"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u8_vsnprintf</b><i> (uint8_t *<var>buf</var>, size_t <var>size</var>, const char *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX192"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u8_vasprintf</b><i> (uint8_t **<var>resultp</var>, const char *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX193"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_vasnprintf</b><i> (uint8_t *resultbuf, size_t *<var>lengthp</var>, const char *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX194"></a>
+</dt>
+</dl>
+
+<p>The following functions take an UTF-8 format string and return a result in
+UTF-8 format.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>u8_u8_sprintf</b><i> (uint8_t *<var>buf</var>, const uint8_t *<var>format</var>, ...)</i>
+<a name="IDX195"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u8_u8_snprintf</b><i> (uint8_t *<var>buf</var>, size_t <var>size</var>, const uint8_t *<var>format</var>, ...)</i>
+<a name="IDX196"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u8_u8_asprintf</b><i> (uint8_t **<var>resultp</var>, const uint8_t *<var>format</var>, ...)</i>
+<a name="IDX197"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_u8_asnprintf</b><i> (uint8_t *resultbuf, size_t *<var>lengthp</var>, const uint8_t *<var>format</var>, ...)</i>
+<a name="IDX198"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u8_u8_vsprintf</b><i> (uint8_t *<var>buf</var>, const uint8_t *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX199"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u8_u8_vsnprintf</b><i> (uint8_t *<var>buf</var>, size_t <var>size</var>, const uint8_t *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX200"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u8_u8_vasprintf</b><i> (uint8_t **<var>resultp</var>, const uint8_t *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX201"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> uint8_t * <b>u8_u8_vasnprintf</b><i> (uint8_t *resultbuf, size_t *<var>lengthp</var>, const uint8_t *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX202"></a>
+</dt>
+</dl>
+
+<p>The following functions take an ASCII format string and return a result in
+UTF-16 format.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>u16_sprintf</b><i> (uint16_t *<var>buf</var>, const char *<var>format</var>, ...)</i>
+<a name="IDX203"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u16_snprintf</b><i> (uint16_t *<var>buf</var>, size_t <var>size</var>, const char *<var>format</var>, ...)</i>
+<a name="IDX204"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u16_asprintf</b><i> (uint16_t **<var>resultp</var>, const char *<var>format</var>, ...)</i>
+<a name="IDX205"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> uint16_t * <b>u16_asnprintf</b><i> (uint16_t *<var>resultbuf</var>, size_t *<var>lengthp</var>, const char *<var>format</var>, ...)</i>
+<a name="IDX206"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u16_vsprintf</b><i> (uint16_t *<var>buf</var>, const char *<var>format</var>, va_list ap)</i>
+<a name="IDX207"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u16_vsnprintf</b><i> (uint16_t *<var>buf</var>, size_t <var>size</var>, const char *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX208"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u16_vasprintf</b><i> (uint16_t **<var>resultp</var>, const char *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX209"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> uint16_t * <b>u16_vasnprintf</b><i> (uint16_t *resultbuf, size_t *<var>lengthp</var>, const char *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX210"></a>
+</dt>
+</dl>
+
+<p>The following functions take an UTF-16 format string and return a result in
+UTF-16 format.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>u16_u16_sprintf</b><i> (uint16_t *<var>buf</var>, const uint16_t *<var>format</var>, ...)</i>
+<a name="IDX211"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u16_u16_snprintf</b><i> (uint16_t *<var>buf</var>, size_t <var>size</var>, const uint16_t *<var>format</var>, ...)</i>
+<a name="IDX212"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u16_u16_asprintf</b><i> (uint16_t **<var>resultp</var>, const uint16_t *<var>format</var>, ...)</i>
+<a name="IDX213"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> uint16_t * <b>u16_u16_asnprintf</b><i> (uint16_t *resultbuf, size_t *<var>lengthp</var>, const uint16_t *<var>format</var>, ...)</i>
+<a name="IDX214"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u16_u16_vsprintf</b><i> (uint16_t *<var>buf</var>, const uint16_t *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX215"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u16_u16_vsnprintf</b><i> (uint16_t *<var>buf</var>, size_t <var>size</var>, const uint16_t *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX216"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u16_u16_vasprintf</b><i> (uint16_t **<var>resultp</var>, const uint16_t *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX217"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> uint16_t * <b>u16_u16_vasnprintf</b><i> (uint16_t *resultbuf, size_t *<var>lengthp</var>, const uint16_t *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX218"></a>
+</dt>
+</dl>
+
+<p>The following functions take an ASCII format string and return a result in
+UTF-32 format.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>u32_sprintf</b><i> (uint32_t *<var>buf</var>, const char *<var>format</var>, ...)</i>
+<a name="IDX219"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u32_snprintf</b><i> (uint32_t *<var>buf</var>, size_t <var>size</var>, const char *<var>format</var>, ...)</i>
+<a name="IDX220"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u32_asprintf</b><i> (uint32_t **<var>resultp</var>, const char *<var>format</var>, ...)</i>
+<a name="IDX221"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> uint32_t * <b>u32_asnprintf</b><i> (uint32_t *<var>resultbuf</var>, size_t *<var>lengthp</var>, const char *<var>format</var>, ...)</i>
+<a name="IDX222"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u32_vsprintf</b><i> (uint32_t *<var>buf</var>, const char *<var>format</var>, va_list ap)</i>
+<a name="IDX223"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u32_vsnprintf</b><i> (uint32_t *<var>buf</var>, size_t <var>size</var>, const char *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX224"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u32_vasprintf</b><i> (uint32_t **<var>resultp</var>, const char *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX225"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> uint32_t * <b>u32_vasnprintf</b><i> (uint32_t *resultbuf, size_t *<var>lengthp</var>, const char *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX226"></a>
+</dt>
+</dl>
+
+<p>The following functions take an UTF-32 format string and return a result in
+UTF-32 format.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>u32_u32_sprintf</b><i> (uint32_t *<var>buf</var>, const uint32_t *<var>format</var>, ...)</i>
+<a name="IDX227"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u32_u32_snprintf</b><i> (uint32_t *<var>buf</var>, size_t <var>size</var>, const uint32_t *<var>format</var>, ...)</i>
+<a name="IDX228"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u32_u32_asprintf</b><i> (uint32_t **<var>resultp</var>, const uint32_t *<var>format</var>, ...)</i>
+<a name="IDX229"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> uint32_t * <b>u32_u32_asnprintf</b><i> (uint32_t *resultbuf, size_t *<var>lengthp</var>, const uint32_t *<var>format</var>, ...)</i>
+<a name="IDX230"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u32_u32_vsprintf</b><i> (uint32_t *<var>buf</var>, const uint32_t *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX231"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u32_u32_vsnprintf</b><i> (uint32_t *<var>buf</var>, size_t <var>size</var>, const uint32_t *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX232"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>u32_u32_vasprintf</b><i> (uint32_t **<var>resultp</var>, const uint32_t *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX233"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> uint32_t * <b>u32_u32_vasnprintf</b><i> (uint32_t *resultbuf, size_t *<var>lengthp</var>, const uint32_t *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX234"></a>
+</dt>
+</dl>
+
+<p>The following functions take an ASCII format string and produce output in
+locale encoding to a <code>FILE</code> stream.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>ulc_fprintf</b><i> (FILE *<var>stream</var>, const char *<var>format</var>, ...)</i>
+<a name="IDX235"></a>
+</dt>
+</dl>
+<dl>
+<dt><u>Function:</u> int <b>ulc_vfprintf</b><i> (FILE *<var>stream</var>, const char *<var>format</var>, va_list <var>ap</var>)</i>
+<a name="IDX236"></a>
+</dt>
+</dl>
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_5.html#SEC17" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_7.html#SEC19" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_7.html b/doc/libunistring_7.html
new file mode 100644
index 00000000..6fe526d9
--- /dev/null
+++ b/doc/libunistring_7.html
@@ -0,0 +1,125 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: 7. Names of Unicode characters &lt;uniname.h&gt;</title>
+
+<meta name="description" content="GNU libunistring: 7. Names of Unicode characters &lt;uniname.h&gt;">
+<meta name="keywords" content="GNU libunistring: 7. Names of Unicode characters &lt;uniname.h&gt;">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_6.html#SEC18" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_8.html#SEC20" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="uniname_002eh"></a>
+<a name="SEC19"></a>
+<h1 class="chapter"> <a href="libunistring.html#TOC19">7. Names of Unicode characters <code>&lt;uniname.h&gt;</code></a> </h1>
+
+<p>This include file implements the association between a Unicode character and
+its name.
+</p>
+<p>The name of a Unicode character allows to distinguish it from other, similar
+looking characters. For example, the character &lsquo;<samp>x</samp>&rsquo; has the name
+<code>&quot;LATIN SMALL LETTER X&quot;</code> and is therefore different from the character
+named <code>&quot;MULTIPLICATION SIGN&quot;</code>.
+</p>
+<dl>
+<dt><u>Macro:</u> unsigned int <b>UNINAME_MAX</b>
+<a name="IDX237"></a>
+</dt>
+<dd><p>This macro expands to a constant that is the required size of buffer for a
+Unicode character name.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> char * <b>unicode_character_name</b><i> (ucs4_t <var>uc</var>, char *<var>buf</var>)</i>
+<a name="IDX238"></a>
+</dt>
+<dd><p>Looks up the name of a Unicode character, in uppercase ASCII.
+<var>buf</var> must point to a buffer, at least <code>UNINAME_MAX</code> bytes in size.
+Returns the filled <var>buf</var>, or NULL if the character does not have a name.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> ucs4_t <b>unicode_name_character</b><i> (const char *<var>name</var>)</i>
+<a name="IDX239"></a>
+</dt>
+<dd><p>Looks up the Unicode character with a given name, in upper- or lowercase
+ASCII. Returns the character if found, or <code>UNINAME_INVALID</code> if not found.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> ucs4_t <b>UNINAME_INVALID</b>
+<a name="IDX240"></a>
+</dt>
+<dd><p>This macro expands to a constant that is a special return value of the
+<code>unicode_name_character</code> function.
+</p></dd></dl>
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_6.html#SEC18" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_8.html#SEC20" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_8.html b/doc/libunistring_8.html
new file mode 100644
index 00000000..def5e04a
--- /dev/null
+++ b/doc/libunistring_8.html
@@ -0,0 +1,2071 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: 8. Unicode character classification and properties &lt;unictype.h&gt;</title>
+
+<meta name="description" content="GNU libunistring: 8. Unicode character classification and properties &lt;unictype.h&gt;">
+<meta name="keywords" content="GNU libunistring: 8. Unicode character classification and properties &lt;unictype.h&gt;">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_7.html#SEC19" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_9.html#SEC37" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="unictype_002eh"></a>
+<a name="SEC20"></a>
+<h1 class="chapter"> <a href="libunistring.html#TOC20">8. Unicode character classification and properties <code>&lt;unictype.h&gt;</code></a> </h1>
+
+<p>This include file declares functions that classify Unicode characters
+and that test whether Unicode characters have specific properties.
+</p>
+<p>The classification assigns a &ldquo;general category&rdquo; to every Unicode
+character. This is similar to the classification provided by ISO C in
+<code>&lt;wctype.h&gt;</code>.
+</p>
+<p>Properties are the data that guides various text processing algorithms
+in the presence of specific Unicode characters.
+</p>
+
+<hr size="6">
+<a name="General-category"></a>
+<a name="SEC21"></a>
+<h2 class="section"> <a href="libunistring.html#TOC21">8.1 General category</a> </h2>
+
+<p>Every Unicode character or code point has a <em>general category</em> assigned
+to it. This classification is important for most algorithms that work on
+Unicode text.
+</p>
+<p>The GNU libunistring library provides two kinds of API for working with
+general categories. The object oriented API uses a variable to denote
+every predefined general category value or combinations thereof. The
+low-level API uses a bit mask instead. The advantage of the object oriented
+API is that if only a few predefined general category values are used,
+the data tables are relatively small. When you combine general category
+values (using <code>uc_general_category_or</code>, <code>uc_general_category_and</code>,
+or <code>uc_general_category_and_not</code>), or when you use the low level
+bit masks, a big table is used thats holds the complete general category
+information for all Unicode characters.
+</p>
+
+<hr size="6">
+<a name="Object-oriented-API"></a>
+<a name="SEC22"></a>
+<h3 class="subsection"> <a href="libunistring.html#TOC22">8.1.1 The object oriented API for general category</a> </h3>
+
+<dl>
+<dt><u>Type:</u> <b>uc_general_category_t</b>
+<a name="IDX241"></a>
+</dt>
+<dd><p>This data type denotes a general category value. It is an immediate type that
+can be copied by simple assignment, without involving memory allocation. It is
+not an array type.
+</p></dd></dl>
+
+<p>The following are the predefined general category value. Additional general
+categories may be added in the future.
+</p>
+<dl>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_L</b>
+<a name="IDX242"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Lu</b>
+<a name="IDX243"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Ll</b>
+<a name="IDX244"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Lt</b>
+<a name="IDX245"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Lm</b>
+<a name="IDX246"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Lo</b>
+<a name="IDX247"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_M</b>
+<a name="IDX248"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Mn</b>
+<a name="IDX249"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Mc</b>
+<a name="IDX250"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Me</b>
+<a name="IDX251"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_N</b>
+<a name="IDX252"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Nd</b>
+<a name="IDX253"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Nl</b>
+<a name="IDX254"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_No</b>
+<a name="IDX255"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_P</b>
+<a name="IDX256"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Pc</b>
+<a name="IDX257"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Pd</b>
+<a name="IDX258"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Ps</b>
+<a name="IDX259"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Pe</b>
+<a name="IDX260"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Pi</b>
+<a name="IDX261"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Pf</b>
+<a name="IDX262"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Po</b>
+<a name="IDX263"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_S</b>
+<a name="IDX264"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Sm</b>
+<a name="IDX265"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Sc</b>
+<a name="IDX266"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Sk</b>
+<a name="IDX267"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_So</b>
+<a name="IDX268"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Z</b>
+<a name="IDX269"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Zs</b>
+<a name="IDX270"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Zl</b>
+<a name="IDX271"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Zp</b>
+<a name="IDX272"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_C</b>
+<a name="IDX273"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Cc</b>
+<a name="IDX274"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Cf</b>
+<a name="IDX275"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Cs</b>
+<a name="IDX276"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Co</b>
+<a name="IDX277"></a>
+</dt>
+<dt><u>Constant:</u> uc_general_category_t <b>UC_CATEGORY_Cn</b>
+<a name="IDX278"></a>
+</dt>
+</dl>
+
+<p>The following are alias names for predefined General category values.
+</p>
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_LETTER</b>
+<a name="IDX279"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_L</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_UPPERCASE_LETTER</b>
+<a name="IDX280"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Lu</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_LOWERCASE_LETTER</b>
+<a name="IDX281"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Ll</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_TITLECASE_LETTER</b>
+<a name="IDX282"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Lt</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_MODIFIER_LETTER</b>
+<a name="IDX283"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Lm</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_OTHER_LETTER</b>
+<a name="IDX284"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Lo</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_MARK</b>
+<a name="IDX285"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_M</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_NON_SPACING_MARK</b>
+<a name="IDX286"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Mn</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_COMBINING_SPACING_MARK</b>
+<a name="IDX287"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Mc</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_ENCLOSING_MARK</b>
+<a name="IDX288"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Me</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_NUMBER</b>
+<a name="IDX289"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_N</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_DECIMAL_DIGIT_NUMBER</b>
+<a name="IDX290"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Nd</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_LETTER_NUMBER</b>
+<a name="IDX291"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Nl</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_OTHER_NUMBER</b>
+<a name="IDX292"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_No</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_PUNCTUATION</b>
+<a name="IDX293"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_P</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_CONNECTOR_PUNCTUATION</b>
+<a name="IDX294"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Pc</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_DASH_PUNCTUATION</b>
+<a name="IDX295"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Pd</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_OPEN_PUNCTUATION</b>
+<a name="IDX296"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Ps</code> (&ldquo;start punctuation&rdquo;).
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_CLOSE_PUNCTUATION</b>
+<a name="IDX297"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Pe</code> (&ldquo;end punctuation&rdquo;).
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_INITIAL_QUOTE_PUNCTUATION</b>
+<a name="IDX298"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Pi</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_FINAL_QUOTE_PUNCTUATION</b>
+<a name="IDX299"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Pf</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_OTHER_PUNCTUATION</b>
+<a name="IDX300"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Po</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_SYMBOL</b>
+<a name="IDX301"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_S</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_MATH_SYMBOL</b>
+<a name="IDX302"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Sm</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_CURRENCY_SYMBOL</b>
+<a name="IDX303"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Sc</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_MODIFIER_SYMBOL</b>
+<a name="IDX304"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Sk</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_OTHER_SYMBOL</b>
+<a name="IDX305"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_So</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_SEPARATOR</b>
+<a name="IDX306"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Z</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_SPACE_SEPARATOR</b>
+<a name="IDX307"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Zs</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_LINE_SEPARATOR</b>
+<a name="IDX308"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Zl</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_PARAGRAPH_SEPARATOR</b>
+<a name="IDX309"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Zp</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_OTHER</b>
+<a name="IDX310"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_C</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_CONTROL</b>
+<a name="IDX311"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Cc</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_FORMAT</b>
+<a name="IDX312"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Cf</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_SURROGATE</b>
+<a name="IDX313"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Cs</code>. All code points in this
+category are invalid characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_PRIVATE_USE</b>
+<a name="IDX314"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Co</code>.
+</p></dd></dl>
+
+<dl>
+<dt><u>Macro:</u> uc_general_category_t <b>UC_UNASSIGNED</b>
+<a name="IDX315"></a>
+</dt>
+<dd><p>This is another name for <code>UC_CATEGORY_Cn</code>. Some code points in this
+category are invalid characters.
+</p></dd></dl>
+
+<p>The following functions combine general categories, like in a boolean algebra,
+except that there is no &lsquo;<samp>not</samp>&rsquo; operation.
+</p>
+<dl>
+<dt><u>Function:</u> uc_general_category_t <b>uc_general_category_or</b><i> (uc_general_category_t <var>category1</var>, uc_general_category_t <var>category2</var>)</i>
+<a name="IDX316"></a>
+</dt>
+<dd><p>Returns the union of two general categories.
+This corresponds to the unions of the two sets of characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uc_general_category_t <b>uc_general_category_and</b><i> (uc_general_category_t <var>category1</var>, uc_general_category_t <var>category2</var>)</i>
+<a name="IDX317"></a>
+</dt>
+<dd><p>Returns the intersection of two general categories as bit masks.
+This <em>does not</em> correspond to the intersection of the two sets of
+characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uc_general_category_t <b>uc_general_category_and_not</b><i> (uc_general_category_t <var>category1</var>, uc_general_category_t <var>category2</var>)</i>
+<a name="IDX318"></a>
+</dt>
+<dd><p>Returns the intersection of a general category with the complement of a
+second general category, as bit masks.
+This <em>does not</em> correspond to the intersection with complement, when
+viewing the categories as sets of characters.
+</p></dd></dl>
+
+<p>The following functions associate general categories with their name.
+</p>
+<dl>
+<dt><u>Function:</u> const char * <b>uc_general_category_name</b><i> (uc_general_category_t <var>category</var>)</i>
+<a name="IDX319"></a>
+</dt>
+<dd><p>Returns the name of a general category.
+Returns NULL if the general category corresponds to a bit mask that does not
+have a name.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> uc_general_category_t <b>uc_general_category_byname</b><i> (const char *<var>category_name</var>)</i>
+<a name="IDX320"></a>
+</dt>
+<dd><p>Returns the general category given by name, e.g. <code>&quot;Lu&quot;</code>.
+</p></dd></dl>
+
+<p>The following functions view general categories as sets of Unicode characters.
+</p>
+<dl>
+<dt><u>Function:</u> uc_general_category_t <b>uc_general_category</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX321"></a>
+</dt>
+<dd><p>Returns the general category of a Unicode character.
+</p>
+<p>This function uses a big table.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_general_category</b><i> (ucs4_t <var>uc</var>, uc_general_category_t <var>category</var>)</i>
+<a name="IDX322"></a>
+</dt>
+<dd><p>Tests whether a Unicode character belongs to a given category.
+The <var>category</var> argument can be a predefined general category or the
+combination of several predefined general categories.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Bit-mask-API"></a>
+<a name="SEC23"></a>
+<h3 class="subsection"> <a href="libunistring.html#TOC23">8.1.2 The bit mask API for general category</a> </h3>
+
+<p>The following are the predefined general category value as bit masks.
+Additional general categories may be added in the future.
+</p>
+<dl>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_L</b>
+<a name="IDX323"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Lu</b>
+<a name="IDX324"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Ll</b>
+<a name="IDX325"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Lt</b>
+<a name="IDX326"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Lm</b>
+<a name="IDX327"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Lo</b>
+<a name="IDX328"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_M</b>
+<a name="IDX329"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Mn</b>
+<a name="IDX330"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Mc</b>
+<a name="IDX331"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Me</b>
+<a name="IDX332"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_N</b>
+<a name="IDX333"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Nd</b>
+<a name="IDX334"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Nl</b>
+<a name="IDX335"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_No</b>
+<a name="IDX336"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_P</b>
+<a name="IDX337"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Pc</b>
+<a name="IDX338"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Pd</b>
+<a name="IDX339"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Ps</b>
+<a name="IDX340"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Pe</b>
+<a name="IDX341"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Pi</b>
+<a name="IDX342"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Pf</b>
+<a name="IDX343"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Po</b>
+<a name="IDX344"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_S</b>
+<a name="IDX345"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Sm</b>
+<a name="IDX346"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Sc</b>
+<a name="IDX347"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Sk</b>
+<a name="IDX348"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_So</b>
+<a name="IDX349"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Z</b>
+<a name="IDX350"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Zs</b>
+<a name="IDX351"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Zl</b>
+<a name="IDX352"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Zp</b>
+<a name="IDX353"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_C</b>
+<a name="IDX354"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Cc</b>
+<a name="IDX355"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Cf</b>
+<a name="IDX356"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Cs</b>
+<a name="IDX357"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Co</b>
+<a name="IDX358"></a>
+</dt>
+<dt><u>Macro:</u> uint32_t <b>UC_CATEGORY_MASK_Cn</b>
+<a name="IDX359"></a>
+</dt>
+</dl>
+
+<p>The following function views general categories as sets of Unicode characters.
+</p>
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_general_category_withtable</b><i> (ucs4_t <var>uc</var>, uint32_t <var>bitmask</var>)</i>
+<a name="IDX360"></a>
+</dt>
+<dd><p>Tests whether a Unicode character belongs to a given category.
+The <var>bitmask</var> argument can be a predefined general category bitmask or the
+combination of several predefined general category bitmasks.
+</p>
+<p>This function uses a big table comprising all general categories.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Canonical-combining-class"></a>
+<a name="SEC24"></a>
+<h2 class="section"> <a href="libunistring.html#TOC24">8.2 Canonical combining class</a> </h2>
+
+<p>Every Unicode character or code point has a <em>canonical combining class</em>
+assigned to it.
+</p>
+<p>What is the meaning of the canonical combining class? Essentially, it
+indicates the priority with which a combining character is attached to its
+base character. The characters for which the canonical combining class is 0
+are the base characters, and the characters for which it is greater than 0 are
+the combining characters. Combining characters are rendered
+near/attached/around their base character, and combining characters with small
+combining classes are attached &quot;first&quot; or &quot;closer&quot; to the base character.
+</p>
+<p>The canonical combining class of a character is a number in the range
+0..255. The possible values are described in the Unicode Character Database
+<a href="http://www.unicode.org/Public/UNIDATA/UCD.html">http://www.unicode.org/Public/UNIDATA/UCD.html</a>. The list here is
+not definitive; more values can be added in future versions.
+</p>
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_NR</b>
+<a name="IDX361"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Not Reordered&rdquo; characters.
+The value is 0.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_OV</b>
+<a name="IDX362"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Overlay&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_NK</b>
+<a name="IDX363"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Nukta&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_KV</b>
+<a name="IDX364"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Kana Voicing&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_VR</b>
+<a name="IDX365"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Virama&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_ATBL</b>
+<a name="IDX366"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Attached Below Left&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_ATB</b>
+<a name="IDX367"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Attached Below&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_ATAR</b>
+<a name="IDX368"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Attached Above Right&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_BL</b>
+<a name="IDX369"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Below Left&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_B</b>
+<a name="IDX370"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Below&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_BR</b>
+<a name="IDX371"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Below Right&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_L</b>
+<a name="IDX372"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Left&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_R</b>
+<a name="IDX373"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Right&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_AL</b>
+<a name="IDX374"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Above Left&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_A</b>
+<a name="IDX375"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Above&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_AR</b>
+<a name="IDX376"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Above Right&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_DB</b>
+<a name="IDX377"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Double Below&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_DA</b>
+<a name="IDX378"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Double Above&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_CCC_IS</b>
+<a name="IDX379"></a>
+</dt>
+<dd><p>The canonical combining class value for &ldquo;Iota Subscript&rdquo; characters.
+</p></dd></dl>
+
+<p>The following function looks up the canonical combining class of a character.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>uc_combining_class</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX380"></a>
+</dt>
+<dd><p>Returns the canonical combining class of a Unicode character.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Bidirectional-category"></a>
+<a name="SEC25"></a>
+<h2 class="section"> <a href="libunistring.html#TOC25">8.3 Bidirectional category</a> </h2>
+
+<p>Every Unicode character or code point has a <em>bidirectional category</em>
+assigned to it.
+</p>
+<p>The bidirectional category guides the bidirectional algorithm
+(<a href="http://www.unicode.org/reports/tr9/">http://www.unicode.org/reports/tr9/</a>). The possible values are
+the following.
+</p>
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_L</b>
+<a name="IDX381"></a>
+</dt>
+<dd><p>The bidirectional category for `Left-to-Right`&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_LRE</b>
+<a name="IDX382"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;Left-to-Right Embedding&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_LRO</b>
+<a name="IDX383"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;Left-to-Right Override&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_R</b>
+<a name="IDX384"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;Right-to-Left&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_AL</b>
+<a name="IDX385"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;Right-to-Left Arabic&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_RLE</b>
+<a name="IDX386"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;Right-to-Left Embedding&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_RLO</b>
+<a name="IDX387"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;Right-to-Left Override&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_PDF</b>
+<a name="IDX388"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;Pop Directional Format&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_EN</b>
+<a name="IDX389"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;European Number&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_ES</b>
+<a name="IDX390"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;European Number Separator&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_ET</b>
+<a name="IDX391"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;European Number Terminator&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_AN</b>
+<a name="IDX392"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;Arabic Number&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_CS</b>
+<a name="IDX393"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;Common Number Separator&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_NSM</b>
+<a name="IDX394"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;Non-Spacing Mark&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_BN</b>
+<a name="IDX395"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;Boundary Neutral&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_B</b>
+<a name="IDX396"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;Paragraph Separator&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_S</b>
+<a name="IDX397"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;Segment Separator&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_WS</b>
+<a name="IDX398"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;Whitespace&rdquo; characters.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_BIDI_ON</b>
+<a name="IDX399"></a>
+</dt>
+<dd><p>The bidirectional category for &ldquo;Other Neutral&rdquo; characters.
+</p></dd></dl>
+
+<p>The following functions implement the association between a bidirectional
+category and its name.
+</p>
+<dl>
+<dt><u>Function:</u> const char * <b>uc_bidi_category_name</b><i> (int <var>category</var>)</i>
+<a name="IDX400"></a>
+</dt>
+<dd><p>Returns the name of a bidirectional category.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> int <b>uc_bidi_category_byname</b><i> (const char *<var>category_name</var>)</i>
+<a name="IDX401"></a>
+</dt>
+<dd><p>Returns the bidirectional category given by name, e.g. <code>&quot;LRE&quot;</code>.
+</p></dd></dl>
+
+<p>The following functions view bidirectional categories as sets of Unicode
+characters.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>uc_bidi_category</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX402"></a>
+</dt>
+<dd><p>Returns the bidirectional category of a Unicode character.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_bidi_category</b><i> (ucs4_t <var>uc</var>, int <var>category</var>)</i>
+<a name="IDX403"></a>
+</dt>
+<dd><p>Tests whether a Unicode character belongs to a given bidirectional category.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Decimal-digit-value"></a>
+<a name="SEC26"></a>
+<h2 class="section"> <a href="libunistring.html#TOC26">8.4 Decimal digit value</a> </h2>
+
+<p>Decimal digits (like the digits from &lsquo;<samp>0</samp>&rsquo; to &lsquo;<samp>9</samp>&rsquo;) exist in many
+scripts. The following function converts a decimal digit character to its
+numerical value.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>uc_decimal_value</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX404"></a>
+</dt>
+<dd><p>Returns the decimal digit value of a Unicode character.
+The return value is an integer in the range 0..9, or -1 for characters that
+do not represent a decimal digit.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Digit-value"></a>
+<a name="SEC27"></a>
+<h2 class="section"> <a href="libunistring.html#TOC27">8.5 Digit value</a> </h2>
+
+<p>Digit characters are like decimal digit characters, possibly in special forms,
+like as superscript, subscript, or circled. The following function converts a
+digit character to its numerical value.
+</p>
+<dl>
+<dt><u>Function:</u> int <b>uc_digit_value</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX405"></a>
+</dt>
+<dd><p>Returns the digit value of a Unicode character.
+The return value is an integer in the range 0..9, or -1 for characters that
+do not represent a digit.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Numeric-value"></a>
+<a name="SEC28"></a>
+<h2 class="section"> <a href="libunistring.html#TOC28">8.6 Numeric value</a> </h2>
+
+<p>There are also characters that represent numbers without a digit system, like
+the Roman numerals, and fractional numbers, like 1/4 or 3/4.
+</p>
+<p>The following type represents the numeric value of a Unicode character.
+</p><dl>
+<dt><u>Type:</u> <b>uc_fraction_t</b>
+<a name="IDX406"></a>
+</dt>
+<dd><p>This is a structure type with the following fields:
+</p><table><tr><td>&nbsp;</td><td><pre class="smallexample">int numerator;
+int denominator;
+</pre></td></tr></table>
+<p>An integer <var>n</var> is represented by <code>numerator = <var>n</var></code>,
+<code>denominator = 1</code>.
+</p></dd></dl>
+
+<p>The following function converts a number character to its numerical value.
+</p>
+<dl>
+<dt><u>Function:</u> uc_fraction_t <b>uc_numeric_value</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX407"></a>
+</dt>
+<dd><p>Returns the numeric value of a Unicode character.
+The return value is a fraction, or the pseudo-fraction <code>{ 0, 0 }</code> for
+characters that do not represent a number.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Mirrored-character"></a>
+<a name="SEC29"></a>
+<h2 class="section"> <a href="libunistring.html#TOC29">8.7 Mirrored character</a> </h2>
+
+<p>Character mirroring is used to associate the closing parenthesis character
+to the opening parenthesis character, the closing brace character with the
+opening brace character, and so on.
+</p>
+<p>The following function looks up the mirrored character of a Unicode character.
+</p>
+<dl>
+<dt><u>Function:</u> bool <b>uc_mirror_char</b><i> (ucs4_t <var>uc</var>, ucs4_t *<var>puc</var>)</i>
+<a name="IDX408"></a>
+</dt>
+<dd><p>Stores the mirrored character of a Unicode character <var>uc</var> in
+<code>*<var>puc</var></code> and returns <code>true</code>, if it exists. Otherwise it
+stores <var>uc</var> unmodified in <code>*<var>puc</var></code> and returns <code>false</code>.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Properties"></a>
+<a name="SEC30"></a>
+<h2 class="section"> <a href="libunistring.html#TOC30">8.8 Properties</a> </h2>
+
+<p>This section defines boolean properties of Unicode characters. This
+means, a character either has the given property or does not have it.
+In other words, the property can be viewed as a subset of the set of
+Unicode characters.
+</p>
+<p>The GNU libunistring library provides two kinds of API for working with
+properties. The object oriented API uses a type <code>uc_property_t</code>
+to designate a property. In the function-based API, which is a bit more
+low level, a property is merely a function.
+</p>
+
+<hr size="6">
+<a name="Properties-as-objects"></a>
+<a name="SEC31"></a>
+<h3 class="subsection"> <a href="libunistring.html#TOC31">8.8.1 Properties as objects &ndash; the object oriented API</a> </h3>
+
+<p>The following type designates a property on Unicode characters.
+</p>
+<dl>
+<dt><u>Type:</u> <b>uc_property_t</b>
+<a name="IDX409"></a>
+</dt>
+<dd><p>This data type denotes a boolean property on Unicode characters. It is an
+immediate type that can be copied by simple assignment, without involving
+memory allocation. It is not an array type.
+</p></dd></dl>
+
+<p>Many Unicode properties are predefined.
+</p>
+<p>The following are general properties.
+</p>
+<dl>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_WHITE_SPACE</b>
+<a name="IDX410"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_ALPHABETIC</b>
+<a name="IDX411"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_OTHER_ALPHABETIC</b>
+<a name="IDX412"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_NOT_A_CHARACTER</b>
+<a name="IDX413"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT</b>
+<a name="IDX414"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT</b>
+<a name="IDX415"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_DEPRECATED</b>
+<a name="IDX416"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_LOGICAL_ORDER_EXCEPTION</b>
+<a name="IDX417"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_VARIATION_SELECTOR</b>
+<a name="IDX418"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_PRIVATE_USE</b>
+<a name="IDX419"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_UNASSIGNED_CODE_VALUE</b>
+<a name="IDX420"></a>
+</dt>
+</dl>
+
+<p>The following properties are related to case folding.
+</p>
+<dl>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_UPPERCASE</b>
+<a name="IDX421"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_OTHER_UPPERCASE</b>
+<a name="IDX422"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_LOWERCASE</b>
+<a name="IDX423"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_OTHER_LOWERCASE</b>
+<a name="IDX424"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_TITLECASE</b>
+<a name="IDX425"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_SOFT_DOTTED</b>
+<a name="IDX426"></a>
+</dt>
+</dl>
+
+<p>The following properties are related to identifiers.
+</p>
+<dl>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_ID_START</b>
+<a name="IDX427"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_OTHER_ID_START</b>
+<a name="IDX428"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_ID_CONTINUE</b>
+<a name="IDX429"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_OTHER_ID_CONTINUE</b>
+<a name="IDX430"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_XID_START</b>
+<a name="IDX431"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_XID_CONTINUE</b>
+<a name="IDX432"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_PATTERN_WHITE_SPACE</b>
+<a name="IDX433"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_PATTERN_SYNTAX</b>
+<a name="IDX434"></a>
+</dt>
+</dl>
+
+<p>The following properties have an influence on shaping and rendering.
+</p>
+<dl>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_JOIN_CONTROL</b>
+<a name="IDX435"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_GRAPHEME_BASE</b>
+<a name="IDX436"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_GRAPHEME_EXTEND</b>
+<a name="IDX437"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_OTHER_GRAPHEME_EXTEND</b>
+<a name="IDX438"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_GRAPHEME_LINK</b>
+<a name="IDX439"></a>
+</dt>
+</dl>
+
+<p>The following properties relate to bidirectional reordering.
+</p>
+<dl>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_BIDI_CONTROL</b>
+<a name="IDX440"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_BIDI_LEFT_TO_RIGHT</b>
+<a name="IDX441"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_BIDI_HEBREW_RIGHT_TO_LEFT</b>
+<a name="IDX442"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_BIDI_ARABIC_RIGHT_TO_LEFT</b>
+<a name="IDX443"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_BIDI_EUROPEAN_DIGIT</b>
+<a name="IDX444"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_BIDI_EUR_NUM_SEPARATOR</b>
+<a name="IDX445"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_BIDI_EUR_NUM_TERMINATOR</b>
+<a name="IDX446"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_BIDI_ARABIC_DIGIT</b>
+<a name="IDX447"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_BIDI_COMMON_SEPARATOR</b>
+<a name="IDX448"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_BIDI_BLOCK_SEPARATOR</b>
+<a name="IDX449"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_BIDI_SEGMENT_SEPARATOR</b>
+<a name="IDX450"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_BIDI_WHITESPACE</b>
+<a name="IDX451"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_BIDI_NON_SPACING_MARK</b>
+<a name="IDX452"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_BIDI_BOUNDARY_NEUTRAL</b>
+<a name="IDX453"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_BIDI_PDF</b>
+<a name="IDX454"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_BIDI_EMBEDDING_OR_OVERRIDE</b>
+<a name="IDX455"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_BIDI_OTHER_NEUTRAL</b>
+<a name="IDX456"></a>
+</dt>
+</dl>
+
+<p>The following properties deal with number representations.
+</p>
+<dl>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_HEX_DIGIT</b>
+<a name="IDX457"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_ASCII_HEX_DIGIT</b>
+<a name="IDX458"></a>
+</dt>
+</dl>
+
+<p>The following properties deal with CJK.
+</p>
+<dl>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_IDEOGRAPHIC</b>
+<a name="IDX459"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_UNIFIED_IDEOGRAPH</b>
+<a name="IDX460"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_RADICAL</b>
+<a name="IDX461"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_IDS_BINARY_OPERATOR</b>
+<a name="IDX462"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_IDS_TRINARY_OPERATOR</b>
+<a name="IDX463"></a>
+</dt>
+</dl>
+
+<p>Other miscellaneous properties are:
+</p>
+<dl>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_ZERO_WIDTH</b>
+<a name="IDX464"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_SPACE</b>
+<a name="IDX465"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_NON_BREAK</b>
+<a name="IDX466"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_ISO_CONTROL</b>
+<a name="IDX467"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_FORMAT_CONTROL</b>
+<a name="IDX468"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_DASH</b>
+<a name="IDX469"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_HYPHEN</b>
+<a name="IDX470"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_PUNCTUATION</b>
+<a name="IDX471"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_LINE_SEPARATOR</b>
+<a name="IDX472"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_PARAGRAPH_SEPARATOR</b>
+<a name="IDX473"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_QUOTATION_MARK</b>
+<a name="IDX474"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_SENTENCE_TERMINAL</b>
+<a name="IDX475"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_TERMINAL_PUNCTUATION</b>
+<a name="IDX476"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_CURRENCY_SYMBOL</b>
+<a name="IDX477"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_MATH</b>
+<a name="IDX478"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_OTHER_MATH</b>
+<a name="IDX479"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_PAIRED_PUNCTUATION</b>
+<a name="IDX480"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_LEFT_OF_PAIR</b>
+<a name="IDX481"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_COMBINING</b>
+<a name="IDX482"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_COMPOSITE</b>
+<a name="IDX483"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_DECIMAL_DIGIT</b>
+<a name="IDX484"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_NUMERIC</b>
+<a name="IDX485"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_DIACRITIC</b>
+<a name="IDX486"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_EXTENDER</b>
+<a name="IDX487"></a>
+</dt>
+<dt><u>Constant:</u> uc_property_t <b>UC_PROPERTY_IGNORABLE_CONTROL</b>
+<a name="IDX488"></a>
+</dt>
+</dl>
+
+<p>The following function looks up a property by its name.
+</p>
+<dl>
+<dt><u>Function:</u> uc_property_t <b>uc_property_byname</b><i> (const char *<var>property_name</var>)</i>
+<a name="IDX489"></a>
+</dt>
+<dd><p>Returns the property given by name, e.g. <code>&quot;White space&quot;</code>. If a property
+with the given name exists, the result will satisfy the
+<code>uc_property_is_valid</code> predicate. Otherwise the result will not satisfy
+this predicate and must not be passed to functions that expect an
+<code>uc_property_t</code> argument.
+</p>
+<p>This function references a big table of all predefined properties. Its use
+can significantly increase the size of your application.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>uc_property_is_valid</b><i> (uc_property_t property)</i>
+<a name="IDX490"></a>
+</dt>
+<dd><p>Returns <code>true</code> when the given property is valid, or <code>false</code>
+otherwise.
+</p></dd></dl>
+
+<p>The following function views a property as a set of Unicode characters.
+</p>
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_property</b><i> (ucs4_t <var>uc</var>, uc_property_t <var>property</var>)</i>
+<a name="IDX491"></a>
+</dt>
+<dd><p>Tests whether the Unicode character <var>uc</var> has the given property.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Properties-as-functions"></a>
+<a name="SEC32"></a>
+<h3 class="subsection"> <a href="libunistring.html#TOC32">8.8.2 Properties as functions &ndash; the functional API</a> </h3>
+
+<p>The following are general properties.
+</p>
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_property_white_space</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX492"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_alphabetic</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX493"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_other_alphabetic</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX494"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_not_a_character</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX495"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_default_ignorable_code_point</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX496"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_other_default_ignorable_code_point</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX497"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_deprecated</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX498"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_logical_order_exception</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX499"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_variation_selector</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX500"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_private_use</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX501"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_unassigned_code_value</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX502"></a>
+</dt>
+</dl>
+
+<p>The following properties are related to case folding.
+</p>
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_property_uppercase</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX503"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_other_uppercase</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX504"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_lowercase</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX505"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_other_lowercase</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX506"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_titlecase</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX507"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_soft_dotted</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX508"></a>
+</dt>
+</dl>
+
+<p>The following properties are related to identifiers.
+</p>
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_property_id_start</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX509"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_other_id_start</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX510"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_id_continue</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX511"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_other_id_continue</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX512"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_xid_start</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX513"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_xid_continue</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX514"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_pattern_white_space</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX515"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_pattern_syntax</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX516"></a>
+</dt>
+</dl>
+
+<p>The following properties have an influence on shaping and rendering.
+</p>
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_property_join_control</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX517"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_grapheme_base</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX518"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_grapheme_extend</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX519"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_other_grapheme_extend</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX520"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_grapheme_link</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX521"></a>
+</dt>
+</dl>
+
+<p>The following properties relate to bidirectional reordering.
+</p>
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_property_bidi_control</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX522"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_bidi_left_to_right</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX523"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_bidi_hebrew_right_to_left</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX524"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_bidi_arabic_right_to_left</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX525"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_bidi_european_digit</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX526"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_bidi_eur_num_separator</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX527"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_bidi_eur_num_terminator</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX528"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_bidi_arabic_digit</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX529"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_bidi_common_separator</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX530"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_bidi_block_separator</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX531"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_bidi_segment_separator</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX532"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_bidi_whitespace</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX533"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_bidi_non_spacing_mark</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX534"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_bidi_boundary_neutral</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX535"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_bidi_pdf</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX536"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_bidi_embedding_or_override</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX537"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_bidi_other_neutral</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX538"></a>
+</dt>
+</dl>
+
+<p>The following properties deal with number representations.
+</p>
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_property_hex_digit</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX539"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_ascii_hex_digit</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX540"></a>
+</dt>
+</dl>
+
+<p>The following properties deal with CJK.
+</p>
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_property_ideographic</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX541"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_unified_ideograph</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX542"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_radical</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX543"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_ids_binary_operator</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX544"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_ids_trinary_operator</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX545"></a>
+</dt>
+</dl>
+
+<p>Other miscellaneous properties are:
+</p>
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_property_zero_width</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX546"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_space</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX547"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_non_break</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX548"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_iso_control</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX549"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_format_control</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX550"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_dash</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX551"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_hyphen</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX552"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_punctuation</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX553"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_line_separator</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX554"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_paragraph_separator</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX555"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_quotation_mark</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX556"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_sentence_terminal</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX557"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_terminal_punctuation</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX558"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_currency_symbol</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX559"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_math</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX560"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_other_math</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX561"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_paired_punctuation</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX562"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_left_of_pair</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX563"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_combining</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX564"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_composite</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX565"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_decimal_digit</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX566"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_numeric</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX567"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_diacritic</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX568"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_extender</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX569"></a>
+</dt>
+<dt><u>Function:</u> bool <b>uc_is_property_ignorable_control</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX570"></a>
+</dt>
+</dl>
+
+<hr size="6">
+<a name="Scripts"></a>
+<a name="SEC33"></a>
+<h2 class="section"> <a href="libunistring.html#TOC33">8.9 Scripts</a> </h2>
+
+<p>The Unicode characters are subdivided into scripts.
+</p>
+<p>The following type is used to represent a script:
+</p>
+<dl>
+<dt><u>Type:</u> <b>uc_script_t</b>
+<a name="IDX571"></a>
+</dt>
+<dd><p>This data type is a structure type that refers to statically allocated
+read-only data. It contains the following fields:
+</p><table><tr><td>&nbsp;</td><td><pre class="smallexample">const char *name;
+</pre></td></tr></table>
+
+<p>The <code>name</code> field contains the name of the script.
+</p></dd></dl>
+
+<a name="IDX572"></a>
+<p>The following functions look up a script.
+</p>
+<dl>
+<dt><u>Function:</u> const uc_script_t * <b>uc_script</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX573"></a>
+</dt>
+<dd><p>Returns the script of a Unicode character. Returns NULL if <var>uc</var> does not
+belong to any script.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> const uc_script_t * <b>uc_script_byname</b><i> (const char *<var>script_name</var>)</i>
+<a name="IDX574"></a>
+</dt>
+<dd><p>Returns the script given by its name, e.g. <code>&quot;HAN&quot;</code>. Returns NULL if a
+script with the given name does not exist.
+</p></dd></dl>
+
+<p>The following function views a script as a set of Unicode characters.
+</p>
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_script</b><i> (ucs4_t <var>uc</var>, const uc_script_t *<var>script</var>)</i>
+<a name="IDX575"></a>
+</dt>
+<dd><p>Tests whether a Unicode character belongs to a given script.
+</p></dd></dl>
+
+<p>The following gives a global picture of all scripts.
+</p>
+<dl>
+<dt><u>Function:</u> void <b>uc_all_scripts</b><i> (const uc_script_t **<var>scripts</var>, size_t *<var>count</var>)</i>
+<a name="IDX576"></a>
+</dt>
+<dd><p>Get the list of all scripts. Stores a pointer to an array of all scripts in
+<code>*<var>scripts</var></code> and the length of this array in <code>*<var>count</var></code>.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Blocks"></a>
+<a name="SEC34"></a>
+<h2 class="section"> <a href="libunistring.html#TOC34">8.10 Blocks</a> </h2>
+
+<p>The Unicode characters are subdivided into blocks. A block is an interval of
+Unicode code points.
+</p>
+<p>The following type is used to represent a block.
+</p>
+<dl>
+<dt><u>Type:</u> <b>uc_block_t</b>
+<a name="IDX577"></a>
+</dt>
+<dd><p>This data type is a structure type that refers to statically allocated data.
+It contains the following fields:
+</p><table><tr><td>&nbsp;</td><td><pre class="smallexample">ucs4_t start;
+ucs4_t end;
+const char *name;
+</pre></td></tr></table>
+
+<p>The <code>start</code> field is the first Unicode code point in the block.
+</p>
+<p>The <code>end</code> field is the last Unicode code point in the block.
+</p>
+<p>The <code>name</code> field is the name of the block.
+</p></dd></dl>
+
+<a name="IDX578"></a>
+<p>The following function looks up a block.
+</p>
+<dl>
+<dt><u>Function:</u> const uc_block_t * <b>uc_block</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX579"></a>
+</dt>
+<dd><p>Returns the block a character belongs to.
+</p></dd></dl>
+
+<p>The following function views a block as a set of Unicode characters.
+</p>
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_block</b><i> (ucs4_t <var>uc</var>, const uc_block_t *<var>block</var>)</i>
+<a name="IDX580"></a>
+</dt>
+<dd><p>Tests whether a Unicode character belongs to a given block.
+</p></dd></dl>
+
+<p>The following gives a global picture of all block.
+</p>
+<dl>
+<dt><u>Function:</u> void <b>uc_all_blocks</b><i> (const uc_block_t **<var>blocks</var>, size_t *<var>count</var>)</i>
+<a name="IDX581"></a>
+</dt>
+<dd><p>Get the list of all blocks. Stores a pointer to an array of all blocks in
+<code>*<var>blocks</var></code> and the length of this array in <code>*<var>count</var></code>.
+</p></dd></dl>
+
+<hr size="6">
+<a name="ISO-C-and-Java-syntax"></a>
+<a name="SEC35"></a>
+<h2 class="section"> <a href="libunistring.html#TOC35">8.11 ISO C and Java syntax</a> </h2>
+
+<p>The following properties are taken from language standards. The supported
+language standards are ISO C 99 and Java.
+</p>
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_c_whitespace</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX582"></a>
+</dt>
+<dd><p>Tests whether a Unicode character is considered whitespace in ISO C 99.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_java_whitespace</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX583"></a>
+</dt>
+<dd><p>Tests whether a Unicode character is considered whitespace in Java.
+</p></dd></dl>
+
+<p>The following enumerated values are the possible return values of the functions
+<code>uc_c_ident_category</code> and <code>uc_java_ident_category</code>.
+</p>
+<dl>
+<dt><u>Constant:</u> int <b>UC_IDENTIFIER_START</b>
+<a name="IDX584"></a>
+</dt>
+<dd><p>This return value means that the given character is valid as first or
+subsequent character in an identifier.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_IDENTIFIER_VALID</b>
+<a name="IDX585"></a>
+</dt>
+<dd><p>This return value means that the given character is valid as subsequent
+character only.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_IDENTIFIER_INVALID</b>
+<a name="IDX586"></a>
+</dt>
+<dd><p>This return value means that the given character is not valid in an identifier.
+</p></dd></dl>
+
+<dl>
+<dt><u>Constant:</u> int <b>UC_IDENTIFIER_IGNORABLE</b>
+<a name="IDX587"></a>
+</dt>
+<dd><p>This return value (only for Java) means that the given character is ignorable.
+</p></dd></dl>
+
+<p>The following function determine whether a given character can be a constituent
+of an identifier in the given programming language.
+</p>
+<a name="IDX588"></a>
+<dl>
+<dt><u>Function:</u> int <b>uc_c_ident_category</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX589"></a>
+</dt>
+<dd><p>Returns the categorization of a Unicode character with respect to the ISO C 99
+identifier syntax.
+</p></dd></dl>
+
+<a name="IDX590"></a>
+<dl>
+<dt><u>Function:</u> int <b>uc_java_ident_category</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX591"></a>
+</dt>
+<dd><p>Returns the categorization of a Unicode character with respect to the Java
+identifier syntax.
+</p></dd></dl>
+
+<hr size="6">
+<a name="Classifications-like-in-ISO-C"></a>
+<a name="SEC36"></a>
+<h2 class="section"> <a href="libunistring.html#TOC36">8.12 Classifications like in ISO C</a> </h2>
+
+<p>The following character classifications mimic those declared in the ISO C
+header files <code>&lt;ctype.h&gt;</code> and <code>&lt;wctype.h&gt;</code>. These functions are
+deprecated, because this set of functions was designed with ASCII in mind and
+cannot reflect the more diverse reality of the Unicode character set. But
+they can be a quick-and-dirty porting aid when migrating from <code>wchar_t</code>
+APIs to Unicode strings.
+</p>
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_alnum</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX592"></a>
+</dt>
+<dd><p>Tests for any character for which <code>uc_is_alpha</code> or <code>uc_is_digit</code> is
+true.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_alpha</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX593"></a>
+</dt>
+<dd><p>Tests for any character for which <code>uc_is_upper</code> or <code>uc_is_lower</code> is
+true, or any character that is one of a locale-specific set of characters for
+which none of <code>uc_is_cntrl</code>, <code>uc_is_digit</code>, <code>uc_is_punct</code>, or
+<code>uc_is_space</code> is true.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_cntrl</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX594"></a>
+</dt>
+<dd><p>Tests for any control character.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_digit</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX595"></a>
+</dt>
+<dd><p>Tests for any character that corresponds to a decimal-digit character.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_graph</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX596"></a>
+</dt>
+<dd><p>Tests for any character for which <code>uc_is_print</code> is true and
+<code>uc_is_space</code> is false.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_lower</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX597"></a>
+</dt>
+<dd><p>Tests for any character that corresponds to a lowercase letter or is one
+of a locale-specific set of characters for which none of <code>uc_is_cntrl</code>,
+<code>uc_is_digit</code>, <code>uc_is_punct</code>, or <code>uc_is_space</code> is true.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_print</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX598"></a>
+</dt>
+<dd><p>Tests for any printing character.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_punct</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX599"></a>
+</dt>
+<dd><p>Tests for any printing character that is one of a locale-specific set of
+characters for which neither <code>uc_is_space</code> nor <code>uc_is_alnum</code> is true.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_space</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX600"></a>
+</dt>
+<dd><p>Test for any character that corresponds to a locale-specific set of characters
+for which none of <code>uc_is_alnum</code>, <code>uc_is_graph</code>, or <code>uc_is_punct</code>
+is true.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_upper</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX601"></a>
+</dt>
+<dd><p>Tests for any character that corresponds to an uppercase letter or is one
+of a locale-specific set of characters for which none of <code>uc_is_cntrl</code>,
+<code>uc_is_digit</code>, <code>uc_is_punct</code>, or <code>uc_is_space</code> is true.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_xdigit</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX602"></a>
+</dt>
+<dd><p>Tests for any character that corresponds to a hexadecimal-digit character.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> bool <b>uc_is_blank</b><i> (ucs4_t <var>uc</var>)</i>
+<a name="IDX603"></a>
+</dt>
+<dd><p>Tests for any character that corresponds to a standard blank character or
+a locale-specific set of characters for which <code>uc_is_alnum</code> is false.
+</p></dd></dl>
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC20" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_9.html#SEC37" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_9.html b/doc/libunistring_9.html
new file mode 100644
index 00000000..0586e0f2
--- /dev/null
+++ b/doc/libunistring_9.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: 9. Display width &lt;uniwidth.h&gt;</title>
+
+<meta name="description" content="GNU libunistring: 9. Display width &lt;uniwidth.h&gt;">
+<meta name="keywords" content="GNU libunistring: 9. Display width &lt;uniwidth.h&gt;">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_8.html#SEC20" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_10.html#SEC38" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+
+<hr size="2">
+<a name="uniwidth_002eh"></a>
+<a name="SEC37"></a>
+<h1 class="chapter"> <a href="libunistring.html#TOC37">9. Display width <code>&lt;uniwidth.h&gt;</code></a> </h1>
+
+<p>This include file declares functions that return the display width, measured
+in columns, of characters or strings, when output to a device that uses
+non-proportional fonts.
+</p>
+<a name="IDX604"></a>
+<p>Note that for some rarely used characters the actual fonts or terminal
+emulators can use a different width. There is no mechanism for communicating
+the display width of characters across a Unix pseudo-terminal (tty). Also,
+there are scripts with complex rendering, like the Indic scripts. For these
+scripts, there is no such concept as non-proportional fonts. Therefore
+the results of these functions usually work fine on most scripts and on
+most characters but can fail to represent the actual display width.
+</p>
+<p>These functions are locale dependent. The <var>encoding</var> argument identifies
+the encoding (e.g. <code>&quot;ISO-8859-2&quot;</code> for Polish).
+</p>
+<a name="IDX605"></a>
+<a name="IDX606"></a>
+<a name="IDX607"></a>
+<dl>
+<dt><u>Function:</u> int <b>uc_width</b><i> (ucs4_t <var>uc</var>, const char *<var>encoding</var>)</i>
+<a name="IDX608"></a>
+</dt>
+<dd><p>Determines and returns the number of column positions required for <var>uc</var>.
+Returns -1 if <var>uc</var> is a control character that has an influence on the
+column position when output.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> int <b>u8_width</b><i> (const uint8_t *<var>s</var>, size_t <var>n</var>, const char *<var>encoding</var>)</i>
+<a name="IDX609"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_width</b><i> (const uint16_t *<var>s</var>, size_t <var>n</var>, const char *<var>encoding</var>)</i>
+<a name="IDX610"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_width</b><i> (const uint32_t *<var>s</var>, size_t <var>n</var>, const char *<var>encoding</var>)</i>
+<a name="IDX611"></a>
+</dt>
+<dd><p>Determines and returns the number of column positions required for first
+<var>n</var> units (or fewer if <var>s</var> ends before this) in <var>s</var>. This
+function ignores control characters in the string.
+</p></dd></dl>
+
+<dl>
+<dt><u>Function:</u> int <b>u8_strwidth</b><i> (const uint8_t *<var>s</var>, const char *<var>encoding</var>)</i>
+<a name="IDX612"></a>
+</dt>
+<dt><u>Function:</u> int <b>u16_strwidth</b><i> (const uint16_t *<var>s</var>, const char *<var>encoding</var>)</i>
+<a name="IDX613"></a>
+</dt>
+<dt><u>Function:</u> int <b>u32_strwidth</b><i> (const uint32_t *<var>s</var>, const char *<var>encoding</var>)</i>
+<a name="IDX614"></a>
+</dt>
+<dd><p>Determines and returns the number of column positions required for <var>s</var>.
+This function ignores control characters in the string.
+</p></dd></dl>
+<hr size="6">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring_8.html#SEC20" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_10.html#SEC38" title="Next chapter"> &gt;&gt; </a>]</td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left"> &nbsp; </td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_abt.html b/doc/libunistring_abt.html
new file mode 100644
index 00000000..47d71bac
--- /dev/null
+++ b/doc/libunistring_abt.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: About This Document</title>
+
+<meta name="description" content="GNU libunistring: About This Document">
+<meta name="keywords" content="GNU libunistring: About This Document">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<a name="SEC_About"></a>
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1>About This Document</h1>
+<p>
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+</p>
+<p>
+ The buttons in the navigation panels have the following meaning:
+</p>
+<table border="1">
+ <tr>
+ <th> Button </th>
+ <th> Name </th>
+ <th> Go to </th>
+ <th> From 1.2.3 go to</th>
+ </tr>
+ <tr>
+ <td align="center"> [ &lt; ] </td>
+ <td align="center">Back</td>
+ <td>Previous section in reading order</td>
+ <td>1.2.2</td>
+ </tr>
+ <tr>
+ <td align="center"> [ &gt; ] </td>
+ <td align="center">Forward</td>
+ <td>Next section in reading order</td>
+ <td>1.2.4</td>
+ </tr>
+ <tr>
+ <td align="center"> [ &lt;&lt; ] </td>
+ <td align="center">FastBack</td>
+ <td>Beginning of this chapter or previous chapter</td>
+ <td>1</td>
+ </tr>
+ <tr>
+ <td align="center"> [ Up ] </td>
+ <td align="center">Up</td>
+ <td>Up section</td>
+ <td>1.2</td>
+ </tr>
+ <tr>
+ <td align="center"> [ &gt;&gt; ] </td>
+ <td align="center">FastForward</td>
+ <td>Next chapter</td>
+ <td>2</td>
+ </tr>
+ <tr>
+ <td align="center"> [Top] </td>
+ <td align="center">Top</td>
+ <td>Cover (top) of document</td>
+ <td> &nbsp; </td>
+ </tr>
+ <tr>
+ <td align="center"> [Contents] </td>
+ <td align="center">Contents</td>
+ <td>Table of contents</td>
+ <td> &nbsp; </td>
+ </tr>
+ <tr>
+ <td align="center"> [Index] </td>
+ <td align="center">Index</td>
+ <td>Index</td>
+ <td> &nbsp; </td>
+ </tr>
+ <tr>
+ <td align="center"> [ ? ] </td>
+ <td align="center">About</td>
+ <td>About (help)</td>
+ <td> &nbsp; </td>
+ </tr>
+</table>
+
+<p>
+ where the <strong> Example </strong> assumes that the current position is at <strong> Subsubsection One-Two-Three </strong> of a document of the following structure:
+</p>
+
+<ul>
+ <li> 1. Section One
+ <ul>
+ <li>1.1 Subsection One-One
+ <ul>
+ <li>...</li>
+ </ul>
+ </li>
+ <li>1.2 Subsection One-Two
+ <ul>
+ <li>1.2.1 Subsubsection One-Two-One</li>
+ <li>1.2.2 Subsubsection One-Two-Two</li>
+ <li>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp;
+ <strong>&lt;== Current Position </strong></li>
+ <li>1.2.4 Subsubsection One-Two-Four</li>
+ </ul>
+ </li>
+ <li>1.3 Subsection One-Three
+ <ul>
+ <li>...</li>
+ </ul>
+ </li>
+ <li>1.4 Subsection One-Four</li>
+ </ul>
+ </li>
+</ul>
+
+<hr size="1">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="libunistring.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/libunistring_toc.html b/doc/libunistring_toc.html
new file mode 100644
index 00000000..e7e4e51e
--- /dev/null
+++ b/doc/libunistring_toc.html
@@ -0,0 +1,164 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
+<html>
+<!-- Created on July, 1 2009 by texi2html 1.78a -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people.
+Send bugs and suggestions to <texi2html-bug@nongnu.org>
+
+-->
+<head>
+<title>GNU libunistring: GNU libunistring</title>
+
+<meta name="description" content="GNU libunistring: GNU libunistring">
+<meta name="keywords" content="GNU libunistring: GNU libunistring">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="Generator" content="texi2html 1.78a">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<style type="text/css">
+<!--
+a.summary-letter {text-decoration: none}
+pre.display {font-family: serif}
+pre.format {font-family: serif}
+pre.menu-comment {font-family: serif}
+pre.menu-preformatted {font-family: serif}
+pre.smalldisplay {font-family: serif; font-size: smaller}
+pre.smallexample {font-size: smaller}
+pre.smallformat {font-family: serif; font-size: smaller}
+pre.smalllisp {font-size: smaller}
+span.roman {font-family:serif; font-weight:normal;}
+span.sansserif {font-family:sans-serif; font-weight:normal;}
+ul.toc {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
+
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<h1 class="settitle">GNU libunistring</h1>
+<a name="SEC_Contents"></a>
+<h1>Table of Contents</h1>
+<div class="contents">
+
+<ul class="toc">
+ <li><a name="TOC1" href="libunistring_1.html#SEC1">1. Introduction</a>
+ <ul class="toc">
+ <li><a name="TOC2" href="libunistring_1.html#SEC2">1.1 Unicode</a></li>
+ <li><a name="TOC3" href="libunistring_1.html#SEC3">1.2 Unicode and Internationalization</a></li>
+ <li><a name="TOC4" href="libunistring_1.html#SEC4">1.3 Locale encodings</a></li>
+ <li><a name="TOC5" href="libunistring_1.html#SEC5">1.4 Choice of in-memory representation of strings</a></li>
+ <li><a name="TOC6" href="libunistring_1.html#SEC6">1.5 &lsquo;<samp>char *</samp>&rsquo; strings</a></li>
+ <li><a name="TOC7" href="libunistring_1.html#SEC7">1.6 The <code>wchar_t</code> mess</a></li>
+ <li><a name="TOC8" href="libunistring_1.html#SEC8">1.7 Unicode strings</a></li>
+ </ul></li>
+ <li><a name="TOC9" href="libunistring_2.html#SEC9">2. Conventions</a></li>
+ <li><a name="TOC10" href="libunistring_3.html#SEC10">3. Elementary types <code>&lt;unitypes.h&gt;</code></a></li>
+ <li><a name="TOC11" href="libunistring_4.html#SEC11">4. Elementary Unicode string functions <code>&lt;unistr.h&gt;</code></a>
+ <ul class="toc">
+ <li><a name="TOC12" href="libunistring_4.html#SEC12">4.1 Elementary string checks</a></li>
+ <li><a name="TOC13" href="libunistring_4.html#SEC13">4.2 Elementary string conversions</a></li>
+ <li><a name="TOC14" href="libunistring_4.html#SEC14">4.3 Elementary string functions</a></li>
+ <li><a name="TOC15" href="libunistring_4.html#SEC15">4.4 Elementary string functions with memory allocation</a></li>
+ <li><a name="TOC16" href="libunistring_4.html#SEC16">4.5 Elementary string functions on NUL terminated strings</a></li>
+ </ul></li>
+ <li><a name="TOC17" href="libunistring_5.html#SEC17">5. Conversions between Unicode and encodings <code>&lt;uniconv.h&gt;</code></a></li>
+ <li><a name="TOC18" href="libunistring_6.html#SEC18">6. Output with Unicode strings <code>&lt;unistdio.h&gt;</code></a></li>
+ <li><a name="TOC19" href="libunistring_7.html#SEC19">7. Names of Unicode characters <code>&lt;uniname.h&gt;</code></a></li>
+ <li><a name="TOC20" href="libunistring_8.html#SEC20">8. Unicode character classification and properties <code>&lt;unictype.h&gt;</code></a>
+ <ul class="toc">
+ <li><a name="TOC21" href="libunistring_8.html#SEC21">8.1 General category</a>
+ <ul class="toc">
+ <li><a name="TOC22" href="libunistring_8.html#SEC22">8.1.1 The object oriented API for general category</a></li>
+ <li><a name="TOC23" href="libunistring_8.html#SEC23">8.1.2 The bit mask API for general category</a></li>
+ </ul></li>
+ <li><a name="TOC24" href="libunistring_8.html#SEC24">8.2 Canonical combining class</a></li>
+ <li><a name="TOC25" href="libunistring_8.html#SEC25">8.3 Bidirectional category</a></li>
+ <li><a name="TOC26" href="libunistring_8.html#SEC26">8.4 Decimal digit value</a></li>
+ <li><a name="TOC27" href="libunistring_8.html#SEC27">8.5 Digit value</a></li>
+ <li><a name="TOC28" href="libunistring_8.html#SEC28">8.6 Numeric value</a></li>
+ <li><a name="TOC29" href="libunistring_8.html#SEC29">8.7 Mirrored character</a></li>
+ <li><a name="TOC30" href="libunistring_8.html#SEC30">8.8 Properties</a>
+ <ul class="toc">
+ <li><a name="TOC31" href="libunistring_8.html#SEC31">8.8.1 Properties as objects &ndash; the object oriented API</a></li>
+ <li><a name="TOC32" href="libunistring_8.html#SEC32">8.8.2 Properties as functions &ndash; the functional API</a></li>
+ </ul></li>
+ <li><a name="TOC33" href="libunistring_8.html#SEC33">8.9 Scripts</a></li>
+ <li><a name="TOC34" href="libunistring_8.html#SEC34">8.10 Blocks</a></li>
+ <li><a name="TOC35" href="libunistring_8.html#SEC35">8.11 ISO C and Java syntax</a></li>
+ <li><a name="TOC36" href="libunistring_8.html#SEC36">8.12 Classifications like in ISO C</a></li>
+ </ul></li>
+ <li><a name="TOC37" href="libunistring_9.html#SEC37">9. Display width <code>&lt;uniwidth.h&gt;</code></a></li>
+ <li><a name="TOC38" href="libunistring_10.html#SEC38">10. Word breaks in strings <code>&lt;uniwbrk.h&gt;</code></a>
+ <ul class="toc">
+ <li><a name="TOC39" href="libunistring_10.html#SEC39">10.1 Word breaks in a string</a></li>
+ <li><a name="TOC40" href="libunistring_10.html#SEC40">10.2 Word break property</a></li>
+ </ul></li>
+ <li><a name="TOC41" href="libunistring_11.html#SEC41">11. Line breaking <code>&lt;unilbrk.h&gt;</code></a></li>
+ <li><a name="TOC42" href="libunistring_12.html#SEC42">12. Normalization forms (composition and decomposition) <code>&lt;uninorm.h&gt;</code></a>
+ <ul class="toc">
+ <li><a name="TOC43" href="libunistring_12.html#SEC43">12.1 Decomposition of Unicode characters</a></li>
+ <li><a name="TOC44" href="libunistring_12.html#SEC44">12.2 Composition of Unicode characters</a></li>
+ <li><a name="TOC45" href="libunistring_12.html#SEC45">12.3 Normalization of strings</a></li>
+ <li><a name="TOC46" href="libunistring_12.html#SEC46">12.4 Normalizing comparisons</a></li>
+ <li><a name="TOC47" href="libunistring_12.html#SEC47">12.5 Normalization of streams of Unicode characters</a></li>
+ </ul></li>
+ <li><a name="TOC48" href="libunistring_13.html#SEC48">13. Case mappings <code>&lt;unicase.h&gt;</code></a>
+ <ul class="toc">
+ <li><a name="TOC49" href="libunistring_13.html#SEC49">13.1 Case mappings of characters</a></li>
+ <li><a name="TOC50" href="libunistring_13.html#SEC50">13.2 Case mappings of strings</a></li>
+ <li><a name="TOC51" href="libunistring_13.html#SEC51">13.3 Case mappings of substrings</a></li>
+ <li><a name="TOC52" href="libunistring_13.html#SEC52">13.4 Case insensitive comparison</a></li>
+ <li><a name="TOC53" href="libunistring_13.html#SEC53">13.5 Case detection</a></li>
+ </ul></li>
+ <li><a name="TOC54" href="libunistring_14.html#SEC54">14. Regular expressions <code>&lt;uniregex.h&gt;</code></a></li>
+ <li><a name="TOC55" href="libunistring_15.html#SEC55">15. Using the library</a>
+ <ul class="toc">
+ <li><a name="TOC56" href="libunistring_15.html#SEC56">15.1 Installation</a></li>
+ <li><a name="TOC57" href="libunistring_15.html#SEC57">15.2 Compiler options</a></li>
+ <li><a name="TOC58" href="libunistring_15.html#SEC58">15.3 Include files</a></li>
+ <li><a name="TOC59" href="libunistring_15.html#SEC59">15.4 Autoconf macro</a></li>
+ <li><a name="TOC60" href="libunistring_15.html#SEC60">15.5 Reporting problems</a></li>
+ </ul></li>
+ <li><a name="TOC61" href="libunistring_16.html#SEC61">16. More advanced functionality</a></li>
+ <li><a name="TOC62" href="libunistring_17.html#SEC62">A. Licenses</a>
+ <ul class="toc">
+ <li><a name="TOC63" href="libunistring_17.html#SEC63">A.1 GNU GENERAL PUBLIC LICENSE</a></li>
+ <li><a name="TOC64" href="libunistring_17.html#SEC68">A.2 GNU LESSER GENERAL PUBLIC LICENSE</a></li>
+ <li><a name="TOC65" href="libunistring_17.html#SEC69">A.3 GNU Free Documentation License</a></li>
+ </ul></li>
+ <li><a name="TOC66" href="libunistring_18.html#SEC71">Index</a></li>
+</ul>
+</div>
+
+<a name="Top"></a>
+<a name="SEC_Top"></a>
+
+
+<hr size="1">
+<table cellpadding="1" cellspacing="1" border="0">
+<tr><td valign="middle" align="left">[<a href="#SEC_Top" title="Cover (top) of document">Top</a>]</td>
+<td valign="middle" align="left">[<a href="#SEC_Contents" title="Table of contents">Contents</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_18.html#SEC71" title="Index">Index</a>]</td>
+<td valign="middle" align="left">[<a href="libunistring_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
+</tr></table>
+<p>
+ <font size="-1">
+ This document was generated by <em>Bruno Haible</em> on <em>July, 1 2009</em> using <a href="http://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
+ </font>
+ <br>
+
+</p>
+</body>
+</html>
diff --git a/doc/stamp-vti b/doc/stamp-vti
new file mode 100644
index 00000000..ee4ba906
--- /dev/null
+++ b/doc/stamp-vti
@@ -0,0 +1,4 @@
+@set UPDATED 29 June 2009
+@set UPDATED-MONTH June 2009
+@set EDITION 0.9.1
+@set VERSION 0.9.1
diff --git a/doc/unicase.texi b/doc/unicase.texi
new file mode 100644
index 00000000..14b46be0
--- /dev/null
+++ b/doc/unicase.texi
@@ -0,0 +1,364 @@
+@node unicase.h
+@chapter Case mappings @code{<unicase.h>}
+
+This include file defines functions for case mapping for Unicode strings and
+case insensitive comparison of Unicode strings and C strings.
+
+These string functions fix the problems that were mentioned in
+@ref{char * strings}, namely, they handle the Croatian
+@sc{LETTER DZ WITH CARON}, the German @sc{LATIN SMALL LETTER SHARP S}, the
+Greek sigma and the Lithuanian i correctly.
+
+@menu
+* Case mappings of characters::
+* Case mappings of strings::
+* Case mappings of substrings::
+* Case insensitive comparison::
+* Case detection::
+@end menu
+
+@node Case mappings of characters
+@section Case mappings of characters
+
+@cindex Unicode character, case mappings
+The following functions implement case mappings on Unicode characters ---
+for those cases only where the result of the mapping is a again a single
+Unicode character.
+
+These mappings are locale and context independent.
+
+@cartouche
+@strong{WARNING!} These functions are not sufficient for languages such as
+German, Greek and Lithuanian. Better use the functions below that treat an
+entire string at once and are language aware.
+@end cartouche
+
+@deftypefun ucs4_t uc_toupper (ucs4_t @var{uc})
+Returns the uppercase mapping of the Unicode character @var{uc}.
+@end deftypefun
+
+@deftypefun ucs4_t uc_tolower (ucs4_t @var{uc})
+Returns the lowercase mapping of the Unicode character @var{uc}.
+@end deftypefun
+
+@deftypefun ucs4_t uc_totitle (ucs4_t @var{uc})
+Returns the titlecase mapping of the Unicode character @var{uc}.
+
+The titlecase mapping of a character is to be used when the character should
+look like upper case and the following characters are lower cased.
+
+For most characters, this is the same as the uppercase mapping. There are
+only few characters where the title case variant and the uuper case variant
+are different. These characters occur in the Latin writing of the Croatian,
+Bosnian, and Serbian languages.
+
+@c Normally we would use .33 space for each column, but this is too much in
+@c TeX mode, see
+@c <http://lists.gnu.org/archive/html/bug-texinfo/2009-05/msg00016.html>.
+@multitable @columnfractions .31 .31 .31
+@headitem Lower case @tab Title case @tab Upper case
+@item LATIN SMALL LETTER LJ
+ @tab LATIN CAPITAL LETTER L WITH SMALL LETTER J
+ @tab LATIN CAPITAL LETTER LJ
+@item LATIN SMALL LETTER NJ
+ @tab LATIN CAPITAL LETTER N WITH SMALL LETTER J
+ @tab LATIN CAPITAL LETTER NJ
+@item LATIN SMALL LETTER DZ
+ @tab LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+ @tab LATIN CAPITAL LETTER DZ
+@item LATIN SMALL LETTER DZ WITH CARON
+ @tab LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+ @tab LATIN CAPITAL LETTER DZ WITH CARON
+@end multitable
+@end deftypefun
+
+@node Case mappings of strings
+@section Case mappings of strings
+
+@cindex case mappings
+@cindex uppercasing
+@cindex lowercasing
+@cindex titlecasing
+Case mapping should always be performed on entire strings, not on individual
+characters. The functions in this sections do so.
+
+These functions allow to apply a normalization after the case mapping. The
+reason is that if you want to treat @samp{@"{a}} and @samp{@"{A}} the same,
+you most often also want to treat the composed and decomposed forms of such
+a character, U+00C4 @sc{LATIN CAPITAL LETTER A WITH DIAERESIS} and
+U+0041 @sc{LATIN CAPITAL LETTER A} U+0308 @sc{COMBINING DIAERESIS} the same.
+The @var{nf} argument designates the normalization.
+
+@cindex locale language
+These functions are locale dependent. The @var{iso639_language} argument
+identifies the language (e.g. @code{"tr"} for Turkish). NULL means to use
+locale independent case mappings.
+
+@deftypefun {const char *} uc_locale_language ()
+Returns the ISO 639 language code of the current locale.
+Returns @code{""} if it is unknown, or in the "C" locale.
+@end deftypefun
+
+@deftypefun {uint8_t *} u8_toupper (const uint8_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint8_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint16_t *} u16_toupper (const uint16_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint16_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint32_t *} u32_toupper (const uint32_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint32_t *@var{resultbuf}, size_t *@var{lengthp})
+Returns the uppercase mapping of a string.
+
+The @var{nf} argument identifies the normalization form to apply after the
+case-mapping. It can also be NULL, for no normalization.
+@end deftypefun
+
+@deftypefun {uint8_t *} u8_tolower (const uint8_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint8_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint16_t *} u16_tolower (const uint16_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint16_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint32_t *} u32_tolower (const uint32_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint32_t *@var{resultbuf}, size_t *@var{lengthp})
+Returns the lowercase mapping of a string.
+
+The @var{nf} argument identifies the normalization form to apply after the
+case-mapping. It can also be NULL, for no normalization.
+@end deftypefun
+
+@deftypefun {uint8_t *} u8_totitle (const uint8_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint8_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint16_t *} u16_totitle (const uint16_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint16_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint32_t *} u32_totitle (const uint32_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint32_t *@var{resultbuf}, size_t *@var{lengthp})
+Returns the titlecase mapping of a string.
+
+Mapping to title case means that, in each word, the first cased character
+is being mapped to title case and the remaining characters of the word
+are being mapped to lower case.
+
+The @var{nf} argument identifies the normalization form to apply after the
+case-mapping. It can also be NULL, for no normalization.
+@end deftypefun
+
+@node Case mappings of substrings
+@section Case mappings of substrings
+
+Case mapping of a substring cannot simply be performed by extracting the
+substring and then applying the case mapping function to it. This does not
+work because case mapping requires some information about the surrounding
+characters. The following functions allow to apply case mappings to
+substrings of a given string, while taking into account the characters that
+precede it (the ``prefix'') and the characters that follow it (the ``suffix'').
+
+@deftp Type casing_prefix_context_t
+This data type denotes the case-mapping context that is given by a prefix
+string. It is an immediate type that can be copied by simple assignment,
+without involving memory allocation. It is not an array type.
+@end deftp
+
+@deftypevr Constant casing_prefix_context_t unicase_empty_prefix_context
+This constant is the case-mapping context that corresponds to an empty prefix
+string.
+@end deftypevr
+
+The following functions return @code{casing_prefix_context_t} objects:
+
+@deftypefun casing_prefix_context_t u8_casing_prefix_context (const uint8_t *@var{s}, size_t @var{n})
+@deftypefunx casing_prefix_context_t u16_casing_prefix_context (const uint16_t *@var{s}, size_t @var{n})
+@deftypefunx casing_prefix_context_t u32_casing_prefix_context (const uint32_t *@var{s}, size_t @var{n})
+Returns the case-mapping context of a given prefix string.
+@end deftypefun
+
+@deftypefun casing_prefix_context_t u8_casing_prefixes_context (const uint8_t *@var{s}, size_t @var{n}, casing_prefix_context_t @var{a_context})
+@deftypefunx casing_prefix_context_t u16_casing_prefixes_context (const uint16_t *@var{s}, size_t @var{n}, casing_prefix_context_t @var{a_context})
+@deftypefunx casing_prefix_context_t u32_casing_prefixes_context (const uint32_t *@var{s}, size_t @var{n}, casing_prefix_context_t @var{a_context})
+Returns the case-mapping context of the prefix concat(@var{a}, @var{s}),
+given the case-mapping context of the prefix @var{a}.
+@end deftypefun
+
+@deftp Type casing_suffix_context_t
+This data type denotes the case-mapping context that is given by a suffix
+string. It is an immediate type that can be copied by simple assignment,
+without involving memory allocation. It is not an array type.
+@end deftp
+
+@deftypevr Constant casing_suffix_context_t unicase_empty_suffix_context
+This constant is the case-mapping context that corresponds to an empty suffix
+string.
+@end deftypevr
+
+The following functions return @code{casing_suffix_context_t} objects:
+
+@deftypefun casing_suffix_context_t u8_casing_suffix_context (const uint8_t *@var{s}, size_t @var{n})
+@deftypefunx casing_suffix_context_t u16_casing_suffix_context (const uint16_t *@var{s}, size_t @var{n})
+@deftypefunx casing_suffix_context_t u32_casing_suffix_context (const uint32_t *@var{s}, size_t @var{n})
+Returns the case-mapping context of a given suffix string.
+@end deftypefun
+
+@deftypefun casing_suffix_context_t u8_casing_suffixes_context (const uint8_t *@var{s}, size_t @var{n}, casing_suffix_context_t @var{a_context})
+@deftypefunx casing_suffix_context_t u16_casing_suffixes_context (const uint16_t *@var{s}, size_t @var{n}, casing_suffix_context_t @var{a_context})
+@deftypefunx casing_suffix_context_t u32_casing_suffixes_context (const uint32_t *@var{s}, size_t @var{n}, casing_suffix_context_t @var{a_context})
+Returns the case-mapping context of the suffix concat(@var{s}, @var{a}),
+given the case-mapping context of the suffix @var{a}.
+@end deftypefun
+
+The following functions perform a case mapping, considering the
+prefix context and the suffix context.
+
+@deftypefun {uint8_t *} u8_ct_toupper (const uint8_t *@var{s}, size_t @var{n}, casing_prefix_context_t @var{prefix_context}, casing_suffix_context_t @var{suffix_context}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint8_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint16_t *} u16_ct_toupper (const uint16_t *@var{s}, size_t @var{n}, casing_prefix_context_t @var{prefix_context}, casing_suffix_context_t @var{suffix_context}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint16_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint32_t *} u32_ct_toupper (const uint32_t *@var{s}, size_t @var{n}, casing_prefix_context_t @var{prefix_context}, casing_suffix_context_t @var{suffix_context}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint32_t *@var{resultbuf}, size_t *@var{lengthp})
+Returns the uppercase mapping of a string that is surrounded by a prefix
+and a suffix.
+@end deftypefun
+
+@deftypefun {uint8_t *} u8_ct_tolower (const uint8_t *@var{s}, size_t @var{n}, casing_prefix_context_t @var{prefix_context}, casing_suffix_context_t @var{suffix_context}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint8_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint16_t *} u16_ct_tolower (const uint16_t *@var{s}, size_t @var{n}, casing_prefix_context_t @var{prefix_context}, casing_suffix_context_t @var{suffix_context}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint16_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint32_t *} u32_ct_tolower (const uint32_t *@var{s}, size_t @var{n}, casing_prefix_context_t @var{prefix_context}, casing_suffix_context_t @var{suffix_context}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint32_t *@var{resultbuf}, size_t *@var{lengthp})
+Returns the lowercase mapping of a string that is surrounded by a prefix
+and a suffix.
+@end deftypefun
+
+@deftypefun {uint8_t *} u8_ct_totitle (const uint8_t *@var{s}, size_t @var{n}, casing_prefix_context_t @var{prefix_context}, casing_suffix_context_t @var{suffix_context}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint8_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint16_t *} u16_ct_totitle (const uint16_t *@var{s}, size_t @var{n}, casing_prefix_context_t @var{prefix_context}, casing_suffix_context_t @var{suffix_context}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint16_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint32_t *} u32_ct_totitle (const uint32_t *@var{s}, size_t @var{n}, casing_prefix_context_t @var{prefix_context}, casing_suffix_context_t @var{suffix_context}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint32_t *@var{resultbuf}, size_t *@var{lengthp})
+Returns the titlecase mapping of a string that is surrounded by a prefix
+and a suffix.
+@end deftypefun
+
+For example, to uppercase the UTF-8 substring between @code{s + start_index}
+and @code{s + end_index} of a string that extends from @code{s} to
+@code{s + u8_strlen (s)}, you can use the statements
+
+@smallexample
+size_t result_length;
+uint8_t result =
+ u8_ct_toupper (s + start_index, end_index - start_index,
+ u8_casing_prefix_context (s, start_index),
+ u8_casing_suffix_context (s + end_index,
+ u8_strlen (s) - end_index),
+ iso639_language, NULL, NULL, &result_length);
+@end smallexample
+
+@node Case insensitive comparison
+@section Case insensitive comparison
+
+@cindex comparing, ignoring case
+@cindex comparing, ignoring normalization and case
+The following functions implement comparison that ignores differences in case
+and normalization.
+
+@deftypefun {uint8_t *} u8_casefold (const uint8_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint8_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint16_t *} u16_casefold (const uint16_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint16_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint32_t *} u32_casefold (const uint32_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint32_t *@var{resultbuf}, size_t *@var{lengthp})
+Returns the case folded string.
+
+Comparing @code{u8_casefold (@var{s1})} and @code{u8_casefold (@var{s2})}
+with the @code{u8_cmp2} function is equivalent to comparing @var{s1} and
+@var{s2} with @code{u8_casecmp}.
+
+The @var{nf} argument identifies the normalization form to apply after the
+case-mapping. It can also be NULL, for no normalization.
+@end deftypefun
+
+@deftypefun {uint8_t *} u8_ct_casefold (const uint8_t *@var{s}, size_t @var{n}, casing_prefix_context_t @var{prefix_context}, casing_suffix_context_t @var{suffix_context}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint8_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint16_t *} u16_ct_casefold (const uint16_t *@var{s}, size_t @var{n}, casing_prefix_context_t @var{prefix_context}, casing_suffix_context_t @var{suffix_context}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint16_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint32_t *} u32_ct_casefold (const uint32_t *@var{s}, size_t @var{n}, casing_prefix_context_t @var{prefix_context}, casing_suffix_context_t @var{suffix_context}, const char *@var{iso639_language}, uninorm_t @var{nf}, uint32_t *@var{resultbuf}, size_t *@var{lengthp})
+Returns the case folded string. The case folding takes into account the
+case mapping contexts of the prefix and suffix strings.
+@end deftypefun
+
+@deftypefun int u8_casecmp (const uint8_t *@var{s1}, size_t @var{n1}, const uint8_t *@var{s2}, size_t @var{n2}, const char *@var{iso639_language}, uninorm_t @var{nf}, int *@var{resultp})
+@deftypefunx int u16_casecmp (const uint16_t *@var{s1}, size_t @var{n1}, const uint16_t *@var{s2}, size_t @var{n2}, const char *@var{iso639_language}, uninorm_t @var{nf}, int *@var{resultp})
+@deftypefunx int u32_casecmp (const uint32_t *@var{s1}, size_t @var{n1}, const uint32_t *@var{s2}, size_t @var{n2}, const char *@var{iso639_language}, uninorm_t @var{nf}, int *@var{resultp})
+@deftypefunx int ulc_casecmp (const char *@var{s1}, size_t @var{n1}, const char *@var{s2}, size_t @var{n2}, const char *@var{iso639_language}, uninorm_t @var{nf}, int *@var{resultp})
+Compares @var{s1} and @var{s2}, ignoring differences in case and normalization.
+
+The @var{nf} argument identifies the normalization form to apply after the
+case-mapping. It can also be NULL, for no normalization.
+
+If successful, sets @code{*@var{resultp}} to -1 if @var{s1} < @var{s2},
+0 if @var{s1} = @var{s2}, 1 if @var{s1} > @var{s2}, and returns 0.
+Upon failure, returns -1 with @code{errno} set.
+@end deftypefun
+
+@cindex comparing, ignoring case, with collation rules
+@cindex comparing, with collation rules, ignoring case
+@cindex comparing, ignoring normalization and case, with collation rules
+@cindex comparing, with collation rules, ignoring normalization and case
+The following functions additionally take into account the sorting rules of the
+current locale.
+
+@deftypefun {char *} u8_casexfrm (const uint8_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, uninorm_t @var{nf}, char *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {char *} u16_casexfrm (const uint16_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, uninorm_t @var{nf}, char *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {char *} u32_casexfrm (const uint32_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, uninorm_t @var{nf}, char *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {char *} ulc_casexfrm (const char *@var{s}, size_t @var{n}, const char *@var{iso639_language}, uninorm_t @var{nf}, char *@var{resultbuf}, size_t *@var{lengthp})
+Converts the string @var{s} of length @var{n} to a NUL-terminated byte
+sequence, in such a way that comparing @code{u8_casexfrm (@var{s1})} and
+@code{u8_casexfrm (@var{s2})} with the gnulib function @code{memcmp2} is
+equivalent to comparing @var{s1} and @var{s2} with @code{u8_casecoll}.
+
+@var{nf} must be either @code{UNINORM_NFC}, @code{UNINORM_NFKC}, or NULL for
+no normalization.
+@end deftypefun
+
+@deftypefun int u8_casecoll (const uint8_t *@var{s1}, size_t @var{n1}, const uint8_t *@var{s2}, size_t @var{n2}, const char *@var{iso639_language}, uninorm_t @var{nf}, int *@var{resultp})
+@deftypefunx int u16_casecoll (const uint16_t *@var{s1}, size_t @var{n1}, const uint16_t *@var{s2}, size_t @var{n2}, const char *@var{iso639_language}, uninorm_t @var{nf}, int *@var{resultp})
+@deftypefunx int u32_casecoll (const uint32_t *@var{s1}, size_t @var{n1}, const uint32_t *@var{s2}, size_t @var{n2}, const char *@var{iso639_language}, uninorm_t @var{nf}, int *@var{resultp})
+@deftypefunx int ulc_casecoll (const char *@var{s1}, size_t @var{n1}, const char *@var{s2}, size_t @var{n2}, const char *@var{iso639_language}, uninorm_t @var{nf}, int *@var{resultp})
+Compares @var{s1} and @var{s2}, ignoring differences in case and normalization,
+using the collation rules of the current locale.
+
+The @var{nf} argument identifies the normalization form to apply after the
+case-mapping. It must be either @code{UNINORM_NFC} or @code{UNINORM_NFKC}.
+It can also be NULL, for no normalization.
+
+If successful, sets @code{*@var{resultp}} to -1 if @var{s1} < @var{s2},
+0 if @var{s1} = @var{s2}, 1 if @var{s1} > @var{s2}, and returns 0.
+Upon failure, returns -1 with @code{errno} set.
+@end deftypefun
+
+@node Case detection
+@section Case detection
+
+@cindex case detection
+@cindex detecting case
+The following functions determine whether a Unicode string is entirely in
+upper case. or entirely in lower case, or entirely in title case, or already
+case-folded.
+
+@deftypefun int u8_is_uppercase (const uint8_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, bool *@var{resultp})
+@deftypefunx int u16_is_uppercase (const uint16_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, bool *@var{resultp})
+@deftypefunx int u32_is_uppercase (const uint32_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, bool *@var{resultp})
+Sets @code{*@var{resultp}} to true if mapping NFD(@var{s}) to upper case is
+a no-op, or to false otherwise, and returns 0. Upon failure, returns -1 with
+@code{errno} set.
+@end deftypefun
+
+@deftypefun int u8_is_lowercase (const uint8_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, bool *@var{resultp})
+@deftypefunx int u16_is_lowercase (const uint16_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, bool *@var{resultp})
+@deftypefunx int u32_is_lowercase (const uint32_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, bool *@var{resultp})
+Sets @code{*@var{resultp}} to true if mapping NFD(@var{s}) to lower case is
+a no-op, or to false otherwise, and returns 0. Upon failure, returns -1 with
+@code{errno} set.
+@end deftypefun
+
+@deftypefun int u8_is_titlecase (const uint8_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, bool *@var{resultp})
+@deftypefunx int u16_is_titlecase (const uint16_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, bool *@var{resultp})
+@deftypefunx int u32_is_titlecase (const uint32_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, bool *@var{resultp})
+Sets @code{*@var{resultp}} to true if mapping NFD(@var{s}) to title case is
+a no-op, or to false otherwise, and returns 0. Upon failure, returns -1 with
+@code{errno} set.
+@end deftypefun
+
+@deftypefun int u8_is_casefolded (const uint8_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, bool *@var{resultp})
+@deftypefunx int u16_is_casefolded (const uint16_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, bool *@var{resultp})
+@deftypefunx int u32_is_casefolded (const uint32_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, bool *@var{resultp})
+Sets @code{*@var{resultp}} to true if applying case folding to NFD(@var{S}) is
+a no-op, or to false otherwise, and returns 0. Upon failure, returns -1 with
+@code{errno} set.
+@end deftypefun
+
+The following functions determine whether case mappings have any effect on a
+Unicode string.
+
+@deftypefun int u8_is_cased (const uint8_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, bool *@var{resultp})
+@deftypefunx int u16_is_cased (const uint16_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, bool *@var{resultp})
+@deftypefunx int u32_is_cased (const uint32_t *@var{s}, size_t @var{n}, const char *@var{iso639_language}, bool *@var{resultp})
+Sets @code{*@var{resultp}} to true if case matters for @var{s}, that is, if
+mapping NFD(@var{s}) to either upper case or lower case or title case is not
+a no-op. Set @code{*@var{resultp}} to false if NFD(@var{s}) maps to itself
+under the upper case mapping, under the lower case mapping, and under the title
+case mapping; in other words, when NFD(@var{s}) consists entirely of caseless
+characters. Upon failure, returns -1 with @code{errno} set.
+@end deftypefun
diff --git a/doc/uniconv.texi b/doc/uniconv.texi
new file mode 100644
index 00000000..07cfa1be
--- /dev/null
+++ b/doc/uniconv.texi
@@ -0,0 +1,157 @@
+@node uniconv.h
+@chapter Conversions between Unicode and encodings @code{<uniconv.h>}
+
+This include file declares functions for converting between Unicode strings
+and @code{char *} strings in locale encoding or in other specified encodings.
+
+@cindex locale encoding
+The following function returns the locale encoding.
+
+@deftypefun {const char *} locale_charset ()
+Determines the current locale's character encoding, and canonicalizes it
+into one of the canonical names listed in @file{config.charset}.
+If the canonical name cannot be determined, the result is a non-canonical
+name.
+
+The result must not be freed; it is statically allocated.
+
+The result of this function can be used as an argument to the @code{iconv_open}
+function in GNU libc, in GNU libiconv, or in the gnulib provided wrapper
+around the native @code{iconv_open} function. It may not work as an argument
+to the native @code{iconv_open} function directly.
+@end deftypefun
+
+The handling of unconvertible characters during the conversions can be
+parametrized through the following enumeration type:
+
+@deftp Type {enum iconv_ilseq_handler}
+This type specifies how unconvertible characters in the input are handled.
+@end deftp
+
+@deftypevr Constant {enum iconv_ilseq_handler} iconveh_error
+This handler causes the function to return with @code{errno} set to
+@code{EILSEQ}.
+@end deftypevr
+
+@deftypevr Constant {enum iconv_ilseq_handler} iconveh_question_mark
+This handler produces one question mark @samp{?} per unconvertible character.
+@end deftypevr
+
+@deftypevr Constant {enum iconv_ilseq_handler} iconveh_escape_sequence
+This handler produces an escape sequence @code{\u@var{xxxx}} or
+@code{\U@var{xxxxxxxx}} for each unconvertible character.
+@end deftypevr
+
+@cindex converting
+The following functions convert between strings in a specified encoding and
+Unicode strings.
+
+@deftypefun {uint8_t *} u8_conv_from_encoding (const char *@var{fromcode}, enum iconv_ilseq_handler @var{handler}, const char *@var{src}, size_t @var{srclen}, size_t *@var{offsets}, uint8_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint16_t *} u16_conv_from_encoding (const char *@var{fromcode}, enum iconv_ilseq_handler @var{handler}, const char *@var{src}, size_t @var{srclen}, size_t *@var{offsets}, uint16_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint32_t *} u32_conv_from_encoding (const char *@var{fromcode}, enum iconv_ilseq_handler @var{handler}, const char *@var{src}, size_t @var{srclen}, size_t *@var{offsets}, uint32_t *@var{resultbuf}, size_t *@var{lengthp})
+Converts an entire string, possibly including NUL bytes, from one encoding
+to UTF-8 encoding.
+
+Converts a memory region given in encoding @var{fromcode}. @var{fromcode} is
+as for the @code{iconv_open} function.
+
+The input is in the memory region between @var{src} (inclusive) and
+@code{@var{src} + @var{srclen}} (exclusive).
+
+If @var{offsets} is not NULL, it should point to an array of @var{srclen}
+integers; this array is filled with offsets into the result, i.e@. the
+character starting at @code{@var{src}[i]} corresponds to the character starting
+at @code{@var{result}[@var{offsets}[i]]}, and other offsets are set to
+@code{(size_t)(-1)}.
+
+@code{@var{resultbuf}} and @code{*@var{lengthp}} should be a scratch
+buffer and its size, or @code{@var{resultbuf}} can be NULL.
+
+May erase the contents of the memory at @code{@var{resultbuf}}.
+
+If successful: The resulting Unicode string (non-NULL) is returned and
+its length stored in @code{*@var{lengthp}}. The resulting string is
+@code{@var{resultbuf}} if no dynamic memory allocation was necessary,
+or a freshly allocated memory block otherwise.
+
+In case of error: NULL is returned and @code{errno} is set.
+Particular @code{errno} values: @code{EINVAL}, @code{EILSEQ}, @code{ENOMEM}.
+@end deftypefun
+
+@deftypefun {char *} u8_conv_to_encoding (const char *@var{tocode}, enum iconv_ilseq_handler @var{handler}, const uint8_t *@var{src}, size_t @var{srclen}, size_t *@var{offsets}, char *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {char *} u16_conv_to_encoding (const char *@var{tocode}, enum iconv_ilseq_handler @var{handler}, const uint16_t *@var{src}, size_t @var{srclen}, size_t *@var{offsets}, char *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {char *} u32_conv_to_encoding (const char *@var{tocode}, enum iconv_ilseq_handler @var{handler}, const uint32_t *@var{src}, size_t @var{srclen}, size_t *@var{offsets}, char *@var{resultbuf}, size_t *@var{lengthp})
+Converts an entire Unicode string, possibly including NUL units, from UTF-8
+encoding to a given encoding.
+
+Converts a memory region to encoding @var{tocode}. @var{tocode} is as for
+the @code{iconv_open} function.
+
+The input is in the memory region between @var{src} (inclusive) and
+@code{@var{src} + @var{srclen}} (exclusive).
+
+If @var{offsets} is not NULL, it should point to an array of @var{srclen}
+integers; this array is filled with offsets into the result, i.e@. the
+character starting at @code{@var{src}[i]} corresponds to the character starting
+at @code{@var{result}[@var{offsets}[i]]}, and other offsets are set to
+@code{(size_t)(-1)}.
+
+@code{@var{resultbuf}} and @code{*@var{lengthp}} should be a scratch
+buffer and its size, or @code{@var{resultbuf}} can be NULL.
+
+May erase the contents of the memory at @code{@var{resultbuf}}.
+
+If successful: The resulting Unicode string (non-NULL) is returned and
+its length stored in @code{*@var{lengthp}}. The resulting string is
+@code{@var{resultbuf}} if no dynamic memory allocation was necessary,
+or a freshly allocated memory block otherwise.
+
+In case of error: NULL is returned and @code{errno} is set.
+Particular @code{errno} values: @code{EINVAL}, @code{EILSEQ}, @code{ENOMEM}.
+@end deftypefun
+
+The following functions convert between NUL terminated strings in a specified
+encoding and NUL terminated Unicode strings.
+
+@deftypefun {uint8_t *} u8_strconv_from_encoding (const char *@var{string}, const char *@var{fromcode}, enum iconv_ilseq_handler @var{handler})
+@deftypefunx {uint16_t *} u16_strconv_from_encoding (const char *@var{string}, const char *@var{fromcode}, enum iconv_ilseq_handler @var{handler})
+@deftypefunx {uint32_t *} u32_strconv_from_encoding (const char *@var{string}, const char *@var{fromcode}, enum iconv_ilseq_handler @var{handler})
+Converts a NUL terminated string from a given encoding.
+
+The result is @code{malloc} allocated, or NULL (with @var{errno} set) in case of error.
+
+Particular @code{errno} values: @code{EILSEQ}, @code{ENOMEM}.
+@end deftypefun
+
+@deftypefun {char *} u8_strconv_to_encoding (const uint8_t *@var{string}, const char *@var{tocode}, enum iconv_ilseq_handler @var{handler})
+@deftypefunx {char *} u16_strconv_to_encoding (const uint16_t *@var{string}, const char *@var{tocode}, enum iconv_ilseq_handler @var{handler})
+@deftypefunx {char *} u32_strconv_to_encoding (const uint32_t *@var{string}, const char *@var{tocode}, enum iconv_ilseq_handler @var{handler})
+Converts a NUL terminated string to a given encoding.
+
+The result is @code{malloc} allocated, or NULL (with @code{errno} set) in case of error.
+
+Particular @code{errno} values: @code{EILSEQ}, @code{ENOMEM}.
+@end deftypefun
+
+The following functions are shorthands that convert between NUL terminated
+strings in locale encoding and NUL terminated Unicode strings.
+
+@deftypefun {uint8_t *} u8_strconv_from_locale (const char *@var{string})
+@deftypefunx {uint16_t *} u16_strconv_from_locale (const char *@var{string})
+@deftypefunx {uint32_t *} u32_strconv_from_locale (const char *@var{string})
+Converts a NUL terminated string from the locale encoding.
+
+The result is @code{malloc} allocated, or NULL (with @code{errno} set) in case of error.
+
+Particular @code{errno} values: @code{ENOMEM}.
+@end deftypefun
+
+@deftypefun {char *} u8_strconv_to_locale (const uint8_t *@var{string})
+@deftypefunx {char *} u16_strconv_to_locale (const uint16_t *@var{string})
+@deftypefunx {char *} u32_strconv_to_locale (const uint32_t *@var{string})
+Converts a NUL terminated string to the locale encoding.
+
+The result is @code{malloc} allocated, or NULL (with @code{errno} set) in case of error.
+
+Particular @code{errno} values: @code{ENOMEM}.
+@end deftypefun
diff --git a/doc/unictype.texi b/doc/unictype.texi
new file mode 100644
index 00000000..129159c7
--- /dev/null
+++ b/doc/unictype.texi
@@ -0,0 +1,1145 @@
+@node unictype.h
+@chapter Unicode character classification and properties @code{<unictype.h>}
+
+This include file declares functions that classify Unicode characters
+and that test whether Unicode characters have specific properties.
+
+The classification assigns a ``general category'' to every Unicode
+character. This is similar to the classification provided by ISO C in
+@code{<wctype.h>}.
+
+Properties are the data that guides various text processing algorithms
+in the presence of specific Unicode characters.
+
+@menu
+* General category::
+* Canonical combining class::
+* Bidirectional category::
+* Decimal digit value::
+* Digit value::
+* Numeric value::
+* Mirrored character::
+* Properties::
+* Scripts::
+* Blocks::
+* ISO C and Java syntax::
+* Classifications like in ISO C::
+@end menu
+
+@node General category
+@section General category
+
+@cindex general category
+@cindex Unicode character, general category
+@cindex Unicode character, classification
+Every Unicode character or code point has a @emph{general category} assigned
+to it. This classification is important for most algorithms that work on
+Unicode text.
+
+The GNU libunistring library provides two kinds of API for working with
+general categories. The object oriented API uses a variable to denote
+every predefined general category value or combinations thereof. The
+low-level API uses a bit mask instead. The advantage of the object oriented
+API is that if only a few predefined general category values are used,
+the data tables are relatively small. When you combine general category
+values (using @code{uc_general_category_or}, @code{uc_general_category_and},
+or @code{uc_general_category_and_not}), or when you use the low level
+bit masks, a big table is used thats holds the complete general category
+information for all Unicode characters.
+
+@menu
+* Object oriented API::
+* Bit mask API::
+@end menu
+
+@node Object oriented API
+@subsection The object oriented API for general category
+
+@deftp Type uc_general_category_t
+This data type denotes a general category value. It is an immediate type that
+can be copied by simple assignment, without involving memory allocation. It is
+not an array type.
+@end deftp
+
+The following are the predefined general category value. Additional general
+categories may be added in the future.
+
+@deftypevr Constant uc_general_category_t UC_CATEGORY_L
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Lu
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Ll
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Lt
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Lm
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Lo
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_M
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Mn
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Mc
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Me
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_N
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Nd
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Nl
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_No
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_P
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Pc
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Pd
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Ps
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Pe
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Pi
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Pf
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Po
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_S
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Sm
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Sc
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Sk
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_So
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Z
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Zs
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Zl
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Zp
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_C
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Cc
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Cf
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Cs
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Co
+@deftypevrx Constant uc_general_category_t UC_CATEGORY_Cn
+@end deftypevr
+
+The following are alias names for predefined General category values.
+
+@deftypevr Macro uc_general_category_t UC_LETTER
+This is another name for @code{UC_CATEGORY_L}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_UPPERCASE_LETTER
+This is another name for @code{UC_CATEGORY_Lu}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_LOWERCASE_LETTER
+This is another name for @code{UC_CATEGORY_Ll}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_TITLECASE_LETTER
+This is another name for @code{UC_CATEGORY_Lt}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_MODIFIER_LETTER
+This is another name for @code{UC_CATEGORY_Lm}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_OTHER_LETTER
+This is another name for @code{UC_CATEGORY_Lo}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_MARK
+This is another name for @code{UC_CATEGORY_M}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_NON_SPACING_MARK
+This is another name for @code{UC_CATEGORY_Mn}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_COMBINING_SPACING_MARK
+This is another name for @code{UC_CATEGORY_Mc}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_ENCLOSING_MARK
+This is another name for @code{UC_CATEGORY_Me}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_NUMBER
+This is another name for @code{UC_CATEGORY_N}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_DECIMAL_DIGIT_NUMBER
+This is another name for @code{UC_CATEGORY_Nd}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_LETTER_NUMBER
+This is another name for @code{UC_CATEGORY_Nl}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_OTHER_NUMBER
+This is another name for @code{UC_CATEGORY_No}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_PUNCTUATION
+This is another name for @code{UC_CATEGORY_P}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_CONNECTOR_PUNCTUATION
+This is another name for @code{UC_CATEGORY_Pc}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_DASH_PUNCTUATION
+This is another name for @code{UC_CATEGORY_Pd}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_OPEN_PUNCTUATION
+This is another name for @code{UC_CATEGORY_Ps} (``start punctuation'').
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_CLOSE_PUNCTUATION
+This is another name for @code{UC_CATEGORY_Pe} (``end punctuation'').
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_INITIAL_QUOTE_PUNCTUATION
+This is another name for @code{UC_CATEGORY_Pi}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_FINAL_QUOTE_PUNCTUATION
+This is another name for @code{UC_CATEGORY_Pf}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_OTHER_PUNCTUATION
+This is another name for @code{UC_CATEGORY_Po}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_SYMBOL
+This is another name for @code{UC_CATEGORY_S}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_MATH_SYMBOL
+This is another name for @code{UC_CATEGORY_Sm}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_CURRENCY_SYMBOL
+This is another name for @code{UC_CATEGORY_Sc}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_MODIFIER_SYMBOL
+This is another name for @code{UC_CATEGORY_Sk}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_OTHER_SYMBOL
+This is another name for @code{UC_CATEGORY_So}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_SEPARATOR
+This is another name for @code{UC_CATEGORY_Z}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_SPACE_SEPARATOR
+This is another name for @code{UC_CATEGORY_Zs}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_LINE_SEPARATOR
+This is another name for @code{UC_CATEGORY_Zl}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_PARAGRAPH_SEPARATOR
+This is another name for @code{UC_CATEGORY_Zp}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_OTHER
+This is another name for @code{UC_CATEGORY_C}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_CONTROL
+This is another name for @code{UC_CATEGORY_Cc}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_FORMAT
+This is another name for @code{UC_CATEGORY_Cf}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_SURROGATE
+This is another name for @code{UC_CATEGORY_Cs}. All code points in this
+category are invalid characters.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_PRIVATE_USE
+This is another name for @code{UC_CATEGORY_Co}.
+@end deftypevr
+
+@deftypevr Macro uc_general_category_t UC_UNASSIGNED
+This is another name for @code{UC_CATEGORY_Cn}. Some code points in this
+category are invalid characters.
+@end deftypevr
+
+The following functions combine general categories, like in a boolean algebra,
+except that there is no @samp{not} operation.
+
+@deftypefun uc_general_category_t uc_general_category_or (uc_general_category_t @var{category1}, uc_general_category_t @var{category2})
+Returns the union of two general categories.
+This corresponds to the unions of the two sets of characters.
+@end deftypefun
+
+@deftypefun uc_general_category_t uc_general_category_and (uc_general_category_t @var{category1}, uc_general_category_t @var{category2})
+Returns the intersection of two general categories as bit masks.
+This @emph{does not} correspond to the intersection of the two sets of
+characters.
+@c Really??
+@end deftypefun
+
+@deftypefun uc_general_category_t uc_general_category_and_not (uc_general_category_t @var{category1}, uc_general_category_t @var{category2})
+Returns the intersection of a general category with the complement of a
+second general category, as bit masks.
+This @emph{does not} correspond to the intersection with complement, when
+viewing the categories as sets of characters.
+@c Really??
+@end deftypefun
+
+The following functions associate general categories with their name.
+
+@deftypefun {const char *} uc_general_category_name (uc_general_category_t @var{category})
+Returns the name of a general category.
+Returns NULL if the general category corresponds to a bit mask that does not
+have a name.
+@end deftypefun
+
+@deftypefun uc_general_category_t uc_general_category_byname (const char *@var{category_name})
+Returns the general category given by name, e.g@. @code{"Lu"}.
+@end deftypefun
+
+The following functions view general categories as sets of Unicode characters.
+
+@deftypefun uc_general_category_t uc_general_category (ucs4_t @var{uc})
+Returns the general category of a Unicode character.
+
+This function uses a big table.
+@end deftypefun
+
+@deftypefun bool uc_is_general_category (ucs4_t @var{uc}, uc_general_category_t @var{category})
+Tests whether a Unicode character belongs to a given category.
+The @var{category} argument can be a predefined general category or the
+combination of several predefined general categories.
+@end deftypefun
+
+@node Bit mask API
+@subsection The bit mask API for general category
+
+The following are the predefined general category value as bit masks.
+Additional general categories may be added in the future.
+
+@deftypevr Macro uint32_t UC_CATEGORY_MASK_L
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Lu
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Ll
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Lt
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Lm
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Lo
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_M
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Mn
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Mc
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Me
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_N
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Nd
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Nl
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_No
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_P
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Pc
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Pd
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Ps
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Pe
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Pi
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Pf
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Po
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_S
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Sm
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Sc
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Sk
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_So
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Z
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Zs
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Zl
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Zp
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_C
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Cc
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Cf
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Cs
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Co
+@deftypevrx Macro uint32_t UC_CATEGORY_MASK_Cn
+@end deftypevr
+
+The following function views general categories as sets of Unicode characters.
+
+@deftypefun bool uc_is_general_category_withtable (ucs4_t @var{uc}, uint32_t @var{bitmask})
+Tests whether a Unicode character belongs to a given category.
+The @var{bitmask} argument can be a predefined general category bitmask or the
+combination of several predefined general category bitmasks.
+
+This function uses a big table comprising all general categories.
+@end deftypefun
+
+@node Canonical combining class
+@section Canonical combining class
+
+@cindex canonical combining class
+@cindex Unicode character, canonical combining class
+Every Unicode character or code point has a @emph{canonical combining class}
+assigned to it.
+
+What is the meaning of the canonical combining class? Essentially, it
+indicates the priority with which a combining character is attached to its
+base character. The characters for which the canonical combining class is 0
+are the base characters, and the characters for which it is greater than 0 are
+the combining characters. Combining characters are rendered
+near/attached/around their base character, and combining characters with small
+combining classes are attached "first" or "closer" to the base character.
+
+The canonical combining class of a character is a number in the range
+0..255. The possible values are described in the Unicode Character Database
+@texnl{}@url{http://www.unicode.org/Public/UNIDATA/UCD.html}. The list here is
+not definitive; more values can be added in future versions.
+
+@deftypevr Constant int UC_CCC_NR
+The canonical combining class value for ``Not Reordered'' characters.
+The value is 0.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_OV
+The canonical combining class value for ``Overlay'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_NK
+The canonical combining class value for ``Nukta'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_KV
+The canonical combining class value for ``Kana Voicing'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_VR
+The canonical combining class value for ``Virama'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_ATBL
+The canonical combining class value for ``Attached Below Left'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_ATB
+The canonical combining class value for ``Attached Below'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_ATAR
+The canonical combining class value for ``Attached Above Right'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_BL
+The canonical combining class value for ``Below Left'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_B
+The canonical combining class value for ``Below'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_BR
+The canonical combining class value for ``Below Right'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_L
+The canonical combining class value for ``Left'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_R
+The canonical combining class value for ``Right'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_AL
+The canonical combining class value for ``Above Left'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_A
+The canonical combining class value for ``Above'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_AR
+The canonical combining class value for ``Above Right'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_DB
+The canonical combining class value for ``Double Below'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_DA
+The canonical combining class value for ``Double Above'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_CCC_IS
+The canonical combining class value for ``Iota Subscript'' characters.
+@end deftypevr
+
+The following function looks up the canonical combining class of a character.
+
+@deftypefun int uc_combining_class (ucs4_t @var{uc})
+Returns the canonical combining class of a Unicode character.
+@end deftypefun
+
+@node Bidirectional category
+@section Bidirectional category
+
+@cindex bidirectional category
+@cindex Unicode character, bidirectional category
+Every Unicode character or code point has a @emph{bidirectional category}
+assigned to it.
+
+The bidirectional category guides the bidirectional algorithm@texnl{}
+(@url{http://www.unicode.org/reports/tr9/}). The possible values are
+the following.
+
+@deftypevr Constant int UC_BIDI_L
+The bidirectional category for `Left-to-Right`'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_LRE
+The bidirectional category for ``Left-to-Right Embedding'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_LRO
+The bidirectional category for ``Left-to-Right Override'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_R
+The bidirectional category for ``Right-to-Left'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_AL
+The bidirectional category for ``Right-to-Left Arabic'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_RLE
+The bidirectional category for ``Right-to-Left Embedding'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_RLO
+The bidirectional category for ``Right-to-Left Override'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_PDF
+The bidirectional category for ``Pop Directional Format'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_EN
+The bidirectional category for ``European Number'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_ES
+The bidirectional category for ``European Number Separator'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_ET
+The bidirectional category for ``European Number Terminator'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_AN
+The bidirectional category for ``Arabic Number'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_CS
+The bidirectional category for ``Common Number Separator'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_NSM
+The bidirectional category for ``Non-Spacing Mark'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_BN
+The bidirectional category for ``Boundary Neutral'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_B
+The bidirectional category for ``Paragraph Separator'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_S
+The bidirectional category for ``Segment Separator'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_WS
+The bidirectional category for ``Whitespace'' characters.
+@end deftypevr
+
+@deftypevr Constant int UC_BIDI_ON
+The bidirectional category for ``Other Neutral'' characters.
+@end deftypevr
+
+The following functions implement the association between a bidirectional
+category and its name.
+
+@deftypefun {const char *} uc_bidi_category_name (int @var{category})
+Returns the name of a bidirectional category.
+@end deftypefun
+
+@deftypefun int uc_bidi_category_byname (const char *@var{category_name})
+Returns the bidirectional category given by name, e.g@. @code{"LRE"}.
+@end deftypefun
+
+The following functions view bidirectional categories as sets of Unicode
+characters.
+
+@deftypefun int uc_bidi_category (ucs4_t @var{uc})
+Returns the bidirectional category of a Unicode character.
+@end deftypefun
+
+@deftypefun bool uc_is_bidi_category (ucs4_t @var{uc}, int @var{category})
+Tests whether a Unicode character belongs to a given bidirectional category.
+@end deftypefun
+
+@node Decimal digit value
+@section Decimal digit value
+
+@cindex value, of Unicode character
+@cindex Unicode character, value
+Decimal digits (like the digits from @samp{0} to @samp{9}) exist in many
+scripts. The following function converts a decimal digit character to its
+numerical value.
+
+@deftypefun int uc_decimal_value (ucs4_t @var{uc})
+Returns the decimal digit value of a Unicode character.
+The return value is an integer in the range 0..9, or -1 for characters that
+do not represent a decimal digit.
+@end deftypefun
+
+@node Digit value
+@section Digit value
+
+@cindex value, of Unicode character
+@cindex Unicode character, value
+Digit characters are like decimal digit characters, possibly in special forms,
+like as superscript, subscript, or circled. The following function converts a
+digit character to its numerical value.
+
+@deftypefun int uc_digit_value (ucs4_t @var{uc})
+Returns the digit value of a Unicode character.
+The return value is an integer in the range 0..9, or -1 for characters that
+do not represent a digit.
+@end deftypefun
+
+@node Numeric value
+@section Numeric value
+
+@cindex value, of Unicode character
+@cindex Unicode character, value
+There are also characters that represent numbers without a digit system, like
+the Roman numerals, and fractional numbers, like 1/4 or 3/4.
+
+The following type represents the numeric value of a Unicode character.
+@deftp Type uc_fraction_t
+This is a structure type with the following fields:
+@smallexample
+int numerator;
+int denominator;
+@end smallexample
+An integer @var{n} is represented by @code{numerator = @var{n}},
+@code{denominator = 1}.
+@end deftp
+
+The following function converts a number character to its numerical value.
+
+@deftypefun uc_fraction_t uc_numeric_value (ucs4_t @var{uc})
+Returns the numeric value of a Unicode character.
+The return value is a fraction, or the pseudo-fraction @code{@{ 0, 0 @}} for
+characters that do not represent a number.
+@end deftypefun
+
+@node Mirrored character
+@section Mirrored character
+
+@cindex mirroring, of Unicode character
+@cindex Unicode character, mirroring
+Character mirroring is used to associate the closing parenthesis character
+to the opening parenthesis character, the closing brace character with the
+opening brace character, and so on.
+
+The following function looks up the mirrored character of a Unicode character.
+
+@deftypefun bool uc_mirror_char (ucs4_t @var{uc}, ucs4_t *@var{puc})
+Stores the mirrored character of a Unicode character @var{uc} in
+@code{*@var{puc}} and returns @code{true}, if it exists. Otherwise it
+stores @var{uc} unmodified in @code{*@var{puc}} and returns @code{false}.
+@end deftypefun
+
+@node Properties
+@section Properties
+
+@cindex properties, of Unicode character
+@cindex Unicode character, properties
+This section defines boolean properties of Unicode characters. This
+means, a character either has the given property or does not have it.
+In other words, the property can be viewed as a subset of the set of
+Unicode characters.
+
+The GNU libunistring library provides two kinds of API for working with
+properties. The object oriented API uses a type @code{uc_property_t}
+to designate a property. In the function-based API, which is a bit more
+low level, a property is merely a function.
+
+@menu
+* Properties as objects::
+* Properties as functions::
+@end menu
+
+@node Properties as objects
+@subsection Properties as objects -- the object oriented API
+
+The following type designates a property on Unicode characters.
+
+@deftp Type uc_property_t
+This data type denotes a boolean property on Unicode characters. It is an
+immediate type that can be copied by simple assignment, without involving
+memory allocation. It is not an array type.
+@end deftp
+
+Many Unicode properties are predefined.
+
+The following are general properties.
+
+@deftypevr Constant uc_property_t UC_PROPERTY_WHITE_SPACE
+@deftypevrx Constant uc_property_t UC_PROPERTY_ALPHABETIC
+@deftypevrx Constant uc_property_t UC_PROPERTY_OTHER_ALPHABETIC
+@deftypevrx Constant uc_property_t UC_PROPERTY_NOT_A_CHARACTER
+@deftypevrx Constant uc_property_t UC_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT
+@deftypevrx Constant uc_property_t UC_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT
+@deftypevrx Constant uc_property_t UC_PROPERTY_DEPRECATED
+@deftypevrx Constant uc_property_t UC_PROPERTY_LOGICAL_ORDER_EXCEPTION
+@deftypevrx Constant uc_property_t UC_PROPERTY_VARIATION_SELECTOR
+@deftypevrx Constant uc_property_t UC_PROPERTY_PRIVATE_USE
+@deftypevrx Constant uc_property_t UC_PROPERTY_UNASSIGNED_CODE_VALUE
+@end deftypevr
+
+The following properties are related to case folding.
+
+@deftypevr Constant uc_property_t UC_PROPERTY_UPPERCASE
+@deftypevrx Constant uc_property_t UC_PROPERTY_OTHER_UPPERCASE
+@deftypevrx Constant uc_property_t UC_PROPERTY_LOWERCASE
+@deftypevrx Constant uc_property_t UC_PROPERTY_OTHER_LOWERCASE
+@deftypevrx Constant uc_property_t UC_PROPERTY_TITLECASE
+@deftypevrx Constant uc_property_t UC_PROPERTY_SOFT_DOTTED
+@end deftypevr
+
+The following properties are related to identifiers.
+
+@deftypevr Constant uc_property_t UC_PROPERTY_ID_START
+@deftypevrx Constant uc_property_t UC_PROPERTY_OTHER_ID_START
+@deftypevrx Constant uc_property_t UC_PROPERTY_ID_CONTINUE
+@deftypevrx Constant uc_property_t UC_PROPERTY_OTHER_ID_CONTINUE
+@deftypevrx Constant uc_property_t UC_PROPERTY_XID_START
+@deftypevrx Constant uc_property_t UC_PROPERTY_XID_CONTINUE
+@deftypevrx Constant uc_property_t UC_PROPERTY_PATTERN_WHITE_SPACE
+@deftypevrx Constant uc_property_t UC_PROPERTY_PATTERN_SYNTAX
+@end deftypevr
+
+The following properties have an influence on shaping and rendering.
+
+@deftypevr Constant uc_property_t UC_PROPERTY_JOIN_CONTROL
+@deftypevrx Constant uc_property_t UC_PROPERTY_GRAPHEME_BASE
+@deftypevrx Constant uc_property_t UC_PROPERTY_GRAPHEME_EXTEND
+@deftypevrx Constant uc_property_t UC_PROPERTY_OTHER_GRAPHEME_EXTEND
+@deftypevrx Constant uc_property_t UC_PROPERTY_GRAPHEME_LINK
+@end deftypevr
+
+The following properties relate to bidirectional reordering.
+
+@deftypevr Constant uc_property_t UC_PROPERTY_BIDI_CONTROL
+@deftypevrx Constant uc_property_t UC_PROPERTY_BIDI_LEFT_TO_RIGHT
+@deftypevrx Constant uc_property_t UC_PROPERTY_BIDI_HEBREW_RIGHT_TO_LEFT
+@deftypevrx Constant uc_property_t UC_PROPERTY_BIDI_ARABIC_RIGHT_TO_LEFT
+@deftypevrx Constant uc_property_t UC_PROPERTY_BIDI_EUROPEAN_DIGIT
+@deftypevrx Constant uc_property_t UC_PROPERTY_BIDI_EUR_NUM_SEPARATOR
+@deftypevrx Constant uc_property_t UC_PROPERTY_BIDI_EUR_NUM_TERMINATOR
+@deftypevrx Constant uc_property_t UC_PROPERTY_BIDI_ARABIC_DIGIT
+@deftypevrx Constant uc_property_t UC_PROPERTY_BIDI_COMMON_SEPARATOR
+@deftypevrx Constant uc_property_t UC_PROPERTY_BIDI_BLOCK_SEPARATOR
+@deftypevrx Constant uc_property_t UC_PROPERTY_BIDI_SEGMENT_SEPARATOR
+@deftypevrx Constant uc_property_t UC_PROPERTY_BIDI_WHITESPACE
+@deftypevrx Constant uc_property_t UC_PROPERTY_BIDI_NON_SPACING_MARK
+@deftypevrx Constant uc_property_t UC_PROPERTY_BIDI_BOUNDARY_NEUTRAL
+@deftypevrx Constant uc_property_t UC_PROPERTY_BIDI_PDF
+@deftypevrx Constant uc_property_t UC_PROPERTY_BIDI_EMBEDDING_OR_OVERRIDE
+@deftypevrx Constant uc_property_t UC_PROPERTY_BIDI_OTHER_NEUTRAL
+@end deftypevr
+
+The following properties deal with number representations.
+
+@deftypevr Constant uc_property_t UC_PROPERTY_HEX_DIGIT
+@deftypevrx Constant uc_property_t UC_PROPERTY_ASCII_HEX_DIGIT
+@end deftypevr
+
+The following properties deal with CJK.
+
+@deftypevr Constant uc_property_t UC_PROPERTY_IDEOGRAPHIC
+@deftypevrx Constant uc_property_t UC_PROPERTY_UNIFIED_IDEOGRAPH
+@deftypevrx Constant uc_property_t UC_PROPERTY_RADICAL
+@deftypevrx Constant uc_property_t UC_PROPERTY_IDS_BINARY_OPERATOR
+@deftypevrx Constant uc_property_t UC_PROPERTY_IDS_TRINARY_OPERATOR
+@end deftypevr
+
+Other miscellaneous properties are:
+
+@deftypevr Constant uc_property_t UC_PROPERTY_ZERO_WIDTH
+@deftypevrx Constant uc_property_t UC_PROPERTY_SPACE
+@deftypevrx Constant uc_property_t UC_PROPERTY_NON_BREAK
+@deftypevrx Constant uc_property_t UC_PROPERTY_ISO_CONTROL
+@deftypevrx Constant uc_property_t UC_PROPERTY_FORMAT_CONTROL
+@deftypevrx Constant uc_property_t UC_PROPERTY_DASH
+@deftypevrx Constant uc_property_t UC_PROPERTY_HYPHEN
+@deftypevrx Constant uc_property_t UC_PROPERTY_PUNCTUATION
+@deftypevrx Constant uc_property_t UC_PROPERTY_LINE_SEPARATOR
+@deftypevrx Constant uc_property_t UC_PROPERTY_PARAGRAPH_SEPARATOR
+@deftypevrx Constant uc_property_t UC_PROPERTY_QUOTATION_MARK
+@deftypevrx Constant uc_property_t UC_PROPERTY_SENTENCE_TERMINAL
+@deftypevrx Constant uc_property_t UC_PROPERTY_TERMINAL_PUNCTUATION
+@deftypevrx Constant uc_property_t UC_PROPERTY_CURRENCY_SYMBOL
+@deftypevrx Constant uc_property_t UC_PROPERTY_MATH
+@deftypevrx Constant uc_property_t UC_PROPERTY_OTHER_MATH
+@deftypevrx Constant uc_property_t UC_PROPERTY_PAIRED_PUNCTUATION
+@deftypevrx Constant uc_property_t UC_PROPERTY_LEFT_OF_PAIR
+@deftypevrx Constant uc_property_t UC_PROPERTY_COMBINING
+@deftypevrx Constant uc_property_t UC_PROPERTY_COMPOSITE
+@deftypevrx Constant uc_property_t UC_PROPERTY_DECIMAL_DIGIT
+@deftypevrx Constant uc_property_t UC_PROPERTY_NUMERIC
+@deftypevrx Constant uc_property_t UC_PROPERTY_DIACRITIC
+@deftypevrx Constant uc_property_t UC_PROPERTY_EXTENDER
+@deftypevrx Constant uc_property_t UC_PROPERTY_IGNORABLE_CONTROL
+@end deftypevr
+
+The following function looks up a property by its name.
+
+@deftypefun uc_property_t uc_property_byname (const char *@var{property_name})
+Returns the property given by name, e.g. @code{"White space"}. If a property
+with the given name exists, the result will satisfy the
+@code{uc_property_is_valid} predicate. Otherwise the result will not satisfy
+this predicate and must not be passed to functions that expect an
+@code{uc_property_t} argument.
+
+This function references a big table of all predefined properties. Its use
+can significantly increase the size of your application.
+@end deftypefun
+
+@deftypefun bool uc_property_is_valid (uc_property_t property)
+Returns @code{true} when the given property is valid, or @code{false}
+otherwise.
+@end deftypefun
+
+The following function views a property as a set of Unicode characters.
+
+@deftypefun bool uc_is_property (ucs4_t @var{uc}, uc_property_t @var{property})
+Tests whether the Unicode character @var{uc} has the given property.
+@end deftypefun
+
+@node Properties as functions
+@subsection Properties as functions -- the functional API
+
+The following are general properties.
+
+@deftypefun bool uc_is_property_white_space (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_alphabetic (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_other_alphabetic (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_not_a_character (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_default_ignorable_code_point (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_other_default_ignorable_code_point (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_deprecated (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_logical_order_exception (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_variation_selector (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_private_use (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_unassigned_code_value (ucs4_t @var{uc})
+@end deftypefun
+
+The following properties are related to case folding.
+
+@deftypefun bool uc_is_property_uppercase (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_other_uppercase (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_lowercase (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_other_lowercase (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_titlecase (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_soft_dotted (ucs4_t @var{uc})
+@end deftypefun
+
+The following properties are related to identifiers.
+
+@deftypefun bool uc_is_property_id_start (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_other_id_start (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_id_continue (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_other_id_continue (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_xid_start (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_xid_continue (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_pattern_white_space (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_pattern_syntax (ucs4_t @var{uc})
+@end deftypefun
+
+The following properties have an influence on shaping and rendering.
+
+@deftypefun bool uc_is_property_join_control (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_grapheme_base (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_grapheme_extend (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_other_grapheme_extend (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_grapheme_link (ucs4_t @var{uc})
+@end deftypefun
+
+The following properties relate to bidirectional reordering.
+
+@deftypefun bool uc_is_property_bidi_control (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_bidi_left_to_right (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_bidi_hebrew_right_to_left (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_bidi_arabic_right_to_left (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_bidi_european_digit (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_bidi_eur_num_separator (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_bidi_eur_num_terminator (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_bidi_arabic_digit (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_bidi_common_separator (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_bidi_block_separator (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_bidi_segment_separator (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_bidi_whitespace (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_bidi_non_spacing_mark (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_bidi_boundary_neutral (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_bidi_pdf (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_bidi_embedding_or_override (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_bidi_other_neutral (ucs4_t @var{uc})
+@end deftypefun
+
+The following properties deal with number representations.
+
+@deftypefun bool uc_is_property_hex_digit (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_ascii_hex_digit (ucs4_t @var{uc})
+@end deftypefun
+
+The following properties deal with CJK.
+
+@deftypefun bool uc_is_property_ideographic (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_unified_ideograph (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_radical (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_ids_binary_operator (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_ids_trinary_operator (ucs4_t @var{uc})
+@end deftypefun
+
+Other miscellaneous properties are:
+
+@deftypefun bool uc_is_property_zero_width (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_space (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_non_break (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_iso_control (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_format_control (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_dash (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_hyphen (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_punctuation (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_line_separator (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_paragraph_separator (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_quotation_mark (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_sentence_terminal (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_terminal_punctuation (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_currency_symbol (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_math (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_other_math (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_paired_punctuation (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_left_of_pair (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_combining (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_composite (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_decimal_digit (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_numeric (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_diacritic (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_extender (ucs4_t @var{uc})
+@deftypefunx bool uc_is_property_ignorable_control (ucs4_t @var{uc})
+@end deftypefun
+
+@node Scripts
+@section Scripts
+
+@cindex scripts
+The Unicode characters are subdivided into scripts.
+
+The following type is used to represent a script:
+
+@deftp Type uc_script_t
+This data type is a structure type that refers to statically allocated
+read-only data. It contains the following fields:
+@smallexample
+const char *name;
+@end smallexample
+
+The @code{name} field contains the name of the script.
+@end deftp
+
+@cindex Unicode character, script
+The following functions look up a script.
+
+@deftypefun {const uc_script_t *} uc_script (ucs4_t @var{uc})
+Returns the script of a Unicode character. Returns NULL if @var{uc} does not
+belong to any script.
+@end deftypefun
+
+@deftypefun {const uc_script_t *} uc_script_byname (const char *@var{script_name})
+Returns the script given by its name, e.g@. @code{"HAN"}. Returns NULL if a
+script with the given name does not exist.
+@end deftypefun
+
+The following function views a script as a set of Unicode characters.
+
+@deftypefun bool uc_is_script (ucs4_t @var{uc}, const uc_script_t *@var{script})
+Tests whether a Unicode character belongs to a given script.
+@end deftypefun
+
+The following gives a global picture of all scripts.
+
+@deftypefun void uc_all_scripts (const uc_script_t **@var{scripts}, size_t *@var{count})
+Get the list of all scripts. Stores a pointer to an array of all scripts in
+@code{*@var{scripts}} and the length of this array in @code{*@var{count}}.
+@end deftypefun
+
+@node Blocks
+@section Blocks
+
+@cindex block
+The Unicode characters are subdivided into blocks. A block is an interval of
+Unicode code points.
+
+The following type is used to represent a block.
+
+@deftp Type uc_block_t
+This data type is a structure type that refers to statically allocated data.
+It contains the following fields:
+@smallexample
+ucs4_t start;
+ucs4_t end;
+const char *name;
+@end smallexample
+
+The @code{start} field is the first Unicode code point in the block.
+
+The @code{end} field is the last Unicode code point in the block.
+
+The @code{name} field is the name of the block.
+@end deftp
+
+@cindex Unicode character, block
+The following function looks up a block.
+
+@deftypefun {const uc_block_t *} uc_block (ucs4_t @var{uc})
+Returns the block a character belongs to.
+@end deftypefun
+
+The following function views a block as a set of Unicode characters.
+
+@deftypefun bool uc_is_block (ucs4_t @var{uc}, const uc_block_t *@var{block})
+Tests whether a Unicode character belongs to a given block.
+@end deftypefun
+
+The following gives a global picture of all block.
+
+@deftypefun void uc_all_blocks (const uc_block_t **@var{blocks}, size_t *@var{count})
+Get the list of all blocks. Stores a pointer to an array of all blocks in
+@code{*@var{blocks}} and the length of this array in @code{*@var{count}}.
+@end deftypefun
+
+@node ISO C and Java syntax
+@section ISO C and Java syntax
+
+@cindex C, programming language
+@cindex Java, programming language
+@cindex identifiers
+The following properties are taken from language standards. The supported
+language standards are ISO C 99 and Java.
+
+@deftypefun bool uc_is_c_whitespace (ucs4_t @var{uc})
+Tests whether a Unicode character is considered whitespace in ISO C 99.
+@end deftypefun
+
+@deftypefun bool uc_is_java_whitespace (ucs4_t @var{uc})
+Tests whether a Unicode character is considered whitespace in Java.
+@end deftypefun
+
+The following enumerated values are the possible return values of the functions
+@code{uc_c_ident_category} and @code{uc_java_ident_category}.
+
+@deftypevr Constant int UC_IDENTIFIER_START
+This return value means that the given character is valid as first or
+subsequent character in an identifier.
+@end deftypevr
+
+@deftypevr Constant int UC_IDENTIFIER_VALID
+This return value means that the given character is valid as subsequent
+character only.
+@end deftypevr
+
+@deftypevr Constant int UC_IDENTIFIER_INVALID
+This return value means that the given character is not valid in an identifier.
+@end deftypevr
+
+@deftypevr Constant int UC_IDENTIFIER_IGNORABLE
+This return value (only for Java) means that the given character is ignorable.
+@end deftypevr
+
+The following function determine whether a given character can be a constituent
+of an identifier in the given programming language.
+
+@cindex Unicode character, validity in C identifiers
+@deftypefun int uc_c_ident_category (ucs4_t @var{uc})
+Returns the categorization of a Unicode character with respect to the ISO C 99
+identifier syntax.
+@end deftypefun
+
+@cindex Unicode character, validity in Java identifiers
+@deftypefun int uc_java_ident_category (ucs4_t @var{uc})
+Returns the categorization of a Unicode character with respect to the Java
+identifier syntax.
+@end deftypefun
+
+@node Classifications like in ISO C
+@section Classifications like in ISO C
+
+@cindex C-like API
+@cindex Unicode character, classification like in C
+The following character classifications mimic those declared in the ISO C
+header files @code{<ctype.h>} and @code{<wctype.h>}. These functions are
+deprecated, because this set of functions was designed with ASCII in mind and
+cannot reflect the more diverse reality of the Unicode character set. But
+they can be a quick-and-dirty porting aid when migrating from @code{wchar_t}
+APIs to Unicode strings.
+
+@deftypefun bool uc_is_alnum (ucs4_t @var{uc})
+Tests for any character for which @code{uc_is_alpha} or @code{uc_is_digit} is
+true.
+@end deftypefun
+
+@deftypefun bool uc_is_alpha (ucs4_t @var{uc})
+Tests for any character for which @code{uc_is_upper} or @code{uc_is_lower} is
+true, or any character that is one of a locale-specific set of characters for
+which none of @code{uc_is_cntrl}, @code{uc_is_digit}, @code{uc_is_punct}, or
+@code{uc_is_space} is true.
+@end deftypefun
+
+@deftypefun bool uc_is_cntrl (ucs4_t @var{uc})
+Tests for any control character.
+@end deftypefun
+
+@deftypefun bool uc_is_digit (ucs4_t @var{uc})
+Tests for any character that corresponds to a decimal-digit character.
+@end deftypefun
+
+@deftypefun bool uc_is_graph (ucs4_t @var{uc})
+Tests for any character for which @code{uc_is_print} is true and
+@code{uc_is_space} is false.
+@end deftypefun
+
+@deftypefun bool uc_is_lower (ucs4_t @var{uc})
+Tests for any character that corresponds to a lowercase letter or is one
+of a locale-specific set of characters for which none of @code{uc_is_cntrl},
+@code{uc_is_digit}, @code{uc_is_punct}, or @code{uc_is_space} is true.
+@end deftypefun
+
+@deftypefun bool uc_is_print (ucs4_t @var{uc})
+Tests for any printing character.
+@end deftypefun
+
+@deftypefun bool uc_is_punct (ucs4_t @var{uc})
+Tests for any printing character that is one of a locale-specific set of
+characters for which neither @code{uc_is_space} nor @code{uc_is_alnum} is true.
+@end deftypefun
+
+@deftypefun bool uc_is_space (ucs4_t @var{uc})
+Test for any character that corresponds to a locale-specific set of characters
+for which none of @code{uc_is_alnum}, @code{uc_is_graph}, or @code{uc_is_punct}
+is true.
+@end deftypefun
+
+@deftypefun bool uc_is_upper (ucs4_t @var{uc})
+Tests for any character that corresponds to an uppercase letter or is one
+of a locale-specific set of characters for which none of @code{uc_is_cntrl},
+@code{uc_is_digit}, @code{uc_is_punct}, or @code{uc_is_space} is true.
+@end deftypefun
+
+@deftypefun bool uc_is_xdigit (ucs4_t @var{uc})
+Tests for any character that corresponds to a hexadecimal-digit character.
+@end deftypefun
+
+@deftypefun bool uc_is_blank (ucs4_t @var{uc})
+Tests for any character that corresponds to a standard blank character or
+a locale-specific set of characters for which @code{uc_is_alnum} is false.
+@end deftypefun
diff --git a/doc/unilbrk.texi b/doc/unilbrk.texi
new file mode 100644
index 00000000..5441f317
--- /dev/null
+++ b/doc/unilbrk.texi
@@ -0,0 +1,88 @@
+@node unilbrk.h
+@chapter Line breaking @code{<unilbrk.h>}
+
+@cindex line breaks
+@cindex breaks, line
+@cindex wrapping
+This include file declares functions for determining where in a string
+line breaks could or should be introduced, in order to make the displayed
+string fit into a column of given width.
+
+These functions are locale dependent. The @var{encoding} argument identifies
+the encoding (e.g@. @code{"ISO-8859-2"} for Polish).
+
+The following enumerated values indicate whether, at a given position, a line
+break is possible or not. Given an string @var{s} as an array
+@code{@var{s}[0..@var{n}-1]} and a position @var{i}, the values have the
+following meanings:
+
+@deftypevr Constant int UC_BREAK_MANDATORY
+This value indicates that @code{@var{s}[@var{i}]} is a line break character.
+@end deftypevr
+
+@deftypevr Constant int UC_BREAK_POSSIBLE
+This value indicates that a line break may be inserted between
+@code{@var{s}[@var{i}-1]} and @code{@var{s}[@var{i}]}.
+@end deftypevr
+
+@deftypevr Constant int UC_BREAK_HYPHENATION
+This value indicates that a hyphen and a line break may be inserted between
+@code{@var{s}[@var{i}-1]} and @code{@var{s}[@var{i}]}. But beware of language
+dependent hyphenation rules.
+@end deftypevr
+
+@deftypevr Constant int UC_BREAK_PROHIBITED
+This value indicates that @code{@var{s}[@var{i}-1]} and @code{@var{s}[@var{i}]}
+must not be separated.
+@end deftypevr
+
+@deftypevr Constant int UC_BREAK_UNDEFINED
+This value is not used as a return value; rather, in the overriding argument of
+the @code{u*_width_linebreaks} functions, it indicates the absence of an
+override.
+@end deftypevr
+
+The following functions determine the positions at which line breaks are
+possible.
+
+@deftypefun void u8_possible_linebreaks (const uint8_t *@var{s}, size_t @var{n}, const char *@var{encoding}, char *@var{p})
+@deftypefunx void u16_possible_linebreaks (const uint16_t *@var{s}, size_t @var{n}, const char *@var{encoding}, char *@var{p})
+@deftypefunx void u32_possible_linebreaks (const uint32_t *@var{s}, size_t @var{n}, const char *@var{encoding}, char *@var{p})
+@deftypefunx void ulc_possible_linebreaks (const char *@var{s}, size_t @var{n}, const char *@var{encoding}, char *@var{p})
+Determines the line break points in @var{s}, and stores the result at
+@code{@var{p}[0..@var{n}-1]}. Every @code{@var{p}[@var{i}]} is assigned one of
+the values @code{UC_BREAK_MANDATORY}, @code{UC_BREAK_POSSIBLE},
+@code{UC_BREAK_HYPHENATION}, @code{UC_BREAK_PROHIBITED}.
+@end deftypefun
+
+The following functions determine where line breaks should be inserted so that
+each line fits in a given width, when output to a device that uses
+non-proportional fonts.
+
+@deftypefun int u8_width_linebreaks (const uint8_t *@var{s}, size_t @var{n}, int @var{width}, int @var{start_column}, int @var{at_end_columns}, const char *@var{override}, const char *@var{encoding}, char *@var{p})
+@deftypefunx int u16_width_linebreaks (const uint16_t *@var{s}, size_t @var{n}, int @var{width}, int @var{start_column}, int @var{at_end_columns}, const char *@var{override}, const char *@var{encoding}, char *@var{p})
+@deftypefunx int u32_width_linebreaks (const uint32_t *@var{s}, size_t @var{n}, int @var{width}, int @var{start_column}, int @var{at_end_columns}, const char *@var{override}, const char *@var{encoding}, char *@var{p})
+@deftypefunx int ulc_width_linebreaks (const char *@var{s}, size_t @var{n}, int @var{width}, int @var{start_column}, int @var{at_end_columns}, const char *@var{override}, const char *@var{encoding}, char *@var{p})
+Chooses the best line breaks, assuming that every character occupies a width
+given by the @code{uc_width} function (see @ref{uniwidth.h}).
+
+The string is @code{@var{s}[0..@var{n}-1]}.
+
+The maximum number of columns per line is given as @var{width}.
+The starting column of the string is given as @var{start_column}.
+If the algorithm shall keep room after the last piece, this amount of room can
+be given as @var{at_end_columns}.
+
+@var{override} is an optional override; if
+@code{@var{override}[@var{i}] != UC_BREAK_UNDEFINED},
+@code{@var{override}[@var{i}]} takes precedence over @code{@var{p}[@var{i}]}
+as returned by the @code{u*_possible_linebreaks} function.
+
+The given @var{encoding} is used for disambiguating widths in @code{uc_width}.
+
+Returns the column after the end of the string, and stores the result at
+@code{@var{p}[0..@var{n}-1]}. Every @code{@var{p}[@var{i}]} is assigned one of
+the values @code{UC_BREAK_MANDATORY}, @code{UC_BREAK_POSSIBLE},
+@code{UC_BREAK_HYPHENATION}, @code{UC_BREAK_PROHIBITED}. Here the value
+@code{UC_BREAK_POSSIBLE} indicates that a line break @emph{should} be inserted.
+@end deftypefun
diff --git a/doc/uniname.texi b/doc/uniname.texi
new file mode 100644
index 00000000..66461be5
--- /dev/null
+++ b/doc/uniname.texi
@@ -0,0 +1,32 @@
+@node uniname.h
+@chapter Names of Unicode characters @code{<uniname.h>}
+
+@cindex Unicode character, name
+This include file implements the association between a Unicode character and
+its name.
+
+The name of a Unicode character allows to distinguish it from other, similar
+looking characters. For example, the character @samp{x} has the name
+@code{"LATIN SMALL LETTER X"} and is therefore different from the character
+named @code{"MULTIPLICATION SIGN"}.
+
+@deftypevr Macro {unsigned int} UNINAME_MAX
+This macro expands to a constant that is the required size of buffer for a
+Unicode character name.
+@end deftypevr
+
+@deftypefun {char *} unicode_character_name (ucs4_t @var{uc}, char *@var{buf})
+Looks up the name of a Unicode character, in uppercase ASCII.
+@var{buf} must point to a buffer, at least @code{UNINAME_MAX} bytes in size.
+Returns the filled @var{buf}, or NULL if the character does not have a name.
+@end deftypefun
+
+@deftypefun ucs4_t unicode_name_character (const char *@var{name})
+Looks up the Unicode character with a given name, in upper- or lowercase
+ASCII. Returns the character if found, or @code{UNINAME_INVALID} if not found.
+@end deftypefun
+
+@deftypevr Macro ucs4_t UNINAME_INVALID
+This macro expands to a constant that is a special return value of the
+@code{unicode_name_character} function.
+@end deftypevr
diff --git a/doc/uninorm.texi b/doc/uninorm.texi
new file mode 100644
index 00000000..d4206d50
--- /dev/null
+++ b/doc/uninorm.texi
@@ -0,0 +1,299 @@
+@node uninorm.h
+@chapter Normalization forms (composition and decomposition) @code{<uninorm.h>}
+
+@cindex normal forms
+@cindex normalizing
+This include file defines functions for transforming Unicode strings to one
+of the four normal forms, known as NFC, NFD, NKFC, NFKD. These
+transformations involve decomposition and --- for NFC and NFKC --- composition
+of Unicode characters.
+
+@menu
+* Decomposition of characters::
+* Composition of characters::
+* Normalization of strings::
+* Normalizing comparisons::
+* Normalization of streams::
+@end menu
+
+@node Decomposition of characters
+@section Decomposition of Unicode characters
+
+@cindex decomposing
+The following enumerated values are the possible types of decomposition of a
+Unicode character.
+
+@deftypevr Constant int UC_DECOMP_CANONICAL
+Denotes canonical decomposition.
+@end deftypevr
+
+@deftypevr Constant int UC_DECOMP_FONT
+UCD marker: @code{<font>}. Denotes a font variant (e.g. a blackletter form).
+@end deftypevr
+
+@deftypevr Constant int UC_DECOMP_NOBREAK
+UCD marker: @code{<noBreak>}.
+Denotes a no-break version of a space or hyphen.
+@end deftypevr
+
+@deftypevr Constant int UC_DECOMP_INITIAL
+UCD marker: @code{<initial>}.
+Denotes an initial presentation form (Arabic).
+@end deftypevr
+
+@deftypevr Constant int UC_DECOMP_MEDIAL
+UCD marker: @code{<medial>}.
+Denotes a medial presentation form (Arabic).
+@end deftypevr
+
+@deftypevr Constant int UC_DECOMP_FINAL
+UCD marker: @code{<final>}.
+Denotes a final presentation form (Arabic).
+@end deftypevr
+
+@deftypevr Constant int UC_DECOMP_ISOLATED
+UCD marker: @code{<isolated>}.
+Denotes an isolated presentation form (Arabic).
+@end deftypevr
+
+@deftypevr Constant int UC_DECOMP_CIRCLE
+UCD marker: @code{<circle>}.
+Denotes an encircled form.
+@end deftypevr
+
+@deftypevr Constant int UC_DECOMP_SUPER
+UCD marker: @code{<super>}.
+Denotes a superscript form.
+@end deftypevr
+
+@deftypevr Constant int UC_DECOMP_SUB
+UCD marker: @code{<sub>}.
+Denotes a subscript form.
+@end deftypevr
+
+@deftypevr Constant int UC_DECOMP_VERTICAL
+UCD marker: @code{<vertical>}.
+Denotes a vertical layout presentation form.
+@end deftypevr
+
+@deftypevr Constant int UC_DECOMP_WIDE
+UCD marker: @code{<wide>}.
+Denotes a wide (or zenkaku) compatibility character.
+@end deftypevr
+
+@deftypevr Constant int UC_DECOMP_NARROW
+UCD marker: @code{<narrow>}.
+Denotes a narrow (or hankaku) compatibility character.
+@end deftypevr
+
+@deftypevr Constant int UC_DECOMP_SMALL
+UCD marker: @code{<small>}.
+Denotes a small variant form (CNS compatibility).
+@end deftypevr
+
+@deftypevr Constant int UC_DECOMP_SQUARE
+UCD marker: @code{<square>}.
+Denotes a CJK squared font variant.
+@end deftypevr
+
+@deftypevr Constant int UC_DECOMP_FRACTION
+UCD marker: @code{<fraction>}.
+Denotes a vulgar fraction form.
+@end deftypevr
+
+@deftypevr Constant int UC_DECOMP_COMPAT
+UCD marker: @code{<compat>}.
+Denotes an otherwise unspecified compatibility character.
+@end deftypevr
+
+The following constant denotes the maximum size of decomposition of a single
+Unicode character.
+
+@deftypevr Macro {unsigned int} UC_DECOMPOSITION_MAX_LENGTH
+This macro expands to a constant that is the required size of buffer passed to
+the @code{uc_decomposition} and @code{uc_canonical_decomposition} functions.
+@end deftypevr
+
+The following functions decompose a Unicode character.
+
+@deftypefun int uc_decomposition (ucs4_t @var{uc}, int *@var{decomp_tag}, ucs4_t *@var{decomposition})
+Returns the character decomposition mapping of the Unicode character @var{uc}.
+@var{decomposition} must point to an array of at least
+@code{UC_DECOMPOSITION_MAX_LENGTH} @code{ucs_t} elements.
+
+When a decomposition exists, @code{@var{decomposition}[0..@var{n}-1]} and
+@code{*@var{decomp_tag}} are filled and @var{n} is returned. Otherwise -1 is
+returned.
+@end deftypefun
+
+@deftypefun int uc_canonical_decomposition (ucs4_t @var{uc}, ucs4_t *@var{decomposition})
+Returns the canonical character decomposition mapping of the Unicode character
+@var{uc}. @var{decomposition} must point to an array of at least
+@code{UC_DECOMPOSITION_MAX_LENGTH} @code{ucs_t} elements.
+
+When a decomposition exists, @code{@var{decomposition}[0..@var{n}-1]} is filled
+and @var{n} is returned. Otherwise -1 is returned.
+@end deftypefun
+
+@node Composition of characters
+@section Composition of Unicode characters
+
+@cindex composing, Unicode characters
+@cindex combining, Unicode characters
+The following function composes a Unicode character from two Unicode
+characters.
+
+@deftypefun ucs4_t uc_composition (ucs4_t @var{uc1}, ucs4_t @var{uc2})
+Attempts to combine the Unicode characters @var{uc1}, @var{uc2}.
+@var{uc1} is known to have canonical combining class 0.
+
+Returns the combination of @var{uc1} and @var{uc2}, if it exists.
+Returns 0 otherwise.
+
+Not all decompositions can be recombined using this function. See the Unicode
+file @file{CompositionExclusions.txt} for details.
+@end deftypefun
+
+@node Normalization of strings
+@section Normalization of strings
+
+The Unicode standard defines four normalization forms for Unicode strings.
+The following type is used to denote a normalization form.
+
+@deftp Type uninorm_t
+An object of type @code{uninorm_t} denotes a Unicode normalization form.
+This is a scalar type; its values can be compared with @code{==}.
+@end deftp
+
+The following constants denote the four normalization forms.
+
+@deftypevr Macro uninorm_t UNINORM_NFD
+Denotes Normalization form D: canonical decomposition.
+@end deftypevr
+
+@deftypevr Macro uninorm_t UNINORM_NFC
+Normalization form C: canonical decomposition, then canonical composition.
+@end deftypevr
+
+@deftypevr Macro uninorm_t UNINORM_NFKD
+Normalization form KD: compatibility decomposition.
+@end deftypevr
+
+@deftypevr Macro uninorm_t UNINORM_NFKC
+Normalization form KC: compatibility decomposition, then canonical composition.
+@end deftypevr
+
+The following functions operate on @code{uninorm_t} objects.
+
+@deftypefun bool uninorm_is_compat_decomposing (uninorm_t @var{nf})
+Tests whether the normalization form @var{nf} does compatibility decomposition.
+@end deftypefun
+
+@deftypefun bool uninorm_is_composing (uninorm_t @var{nf})
+Tests whether the normalization form @var{nf} includes canonical composition.
+@end deftypefun
+
+@deftypefun uninorm_t uninorm_decomposing_form (uninorm_t @var{nf})
+Returns the decomposing variant of the normalization form @var{nf}.
+This maps NFC,NFD @arrow{} NFD and NFKC,NFKD @arrow{} NFKD.
+@end deftypefun
+
+The following functions apply a Unicode normalization form to a Unicode string.
+
+@deftypefun {uint8_t *} u8_normalize (uninorm_t @var{nf}, const uint8_t *@var{s}, size_t @var{n}, uint8_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint16_t *} u16_normalize (uninorm_t @var{nf}, const uint16_t *@var{s}, size_t @var{n}, uint16_t *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {uint32_t *} u32_normalize (uninorm_t @var{nf}, const uint32_t *@var{s}, size_t @var{n}, uint32_t *@var{resultbuf}, size_t *@var{lengthp})
+Returns the specified normalization form of a string.
+@end deftypefun
+
+@node Normalizing comparisons
+@section Normalizing comparisons
+
+@cindex comparing, ignoring normalization
+The following functions compare Unicode string, ignoring differences in
+normalization.
+
+@deftypefun int u8_normcmp (const uint8_t *@var{s1}, size_t @var{n1}, const uint8_t *@var{s2}, size_t @var{n2}, uninorm_t @var{nf}, int *@var{resultp})
+@deftypefunx int u16_normcmp (const uint16_t *@var{s1}, size_t @var{n1}, const uint16_t *@var{s2}, size_t @var{n2}, uninorm_t @var{nf}, int *@var{resultp})
+@deftypefunx int u32_normcmp (const uint32_t *@var{s1}, size_t @var{n1}, const uint32_t *@var{s2}, size_t @var{n2}, uninorm_t @var{nf}, int *@var{resultp})
+Compares @var{s1} and @var{s2}, ignoring differences in normalization.
+
+@var{nf} must be either @code{UNINORM_NFD} or @code{UNINORM_NFKD}.
+
+If successful, sets @code{*@var{resultp}} to -1 if @var{s1} < @var{s2},
+0 if @var{s1} = @var{s2}, 1 if @var{s1} > @var{s2}, and returns 0.
+Upon failure, returns -1 with @code{errno} set.
+@end deftypefun
+
+@cindex comparing, ignoring normalization, with collation rules
+@cindex comparing, with collation rules, ignoring normalization
+@deftypefun {char *} u8_normxfrm (const uint8_t *@var{s}, size_t @var{n}, uninorm_t @var{nf}, char *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {char *} u16_normxfrm (const uint16_t *@var{s}, size_t @var{n}, uninorm_t @var{nf}, char *@var{resultbuf}, size_t *@var{lengthp})
+@deftypefunx {char *} u32_normxfrm (const uint32_t *@var{s}, size_t @var{n}, uninorm_t @var{nf}, char *@var{resultbuf}, size_t *@var{lengthp})
+Converts the string @var{s} of length @var{n} to a NUL-terminated byte
+sequence, in such a way that comparing @code{u8_normxfrm (@var{s1})} and
+@code{u8_normxfrm (@var{s2})} with the @code{u8_cmp2} function is equivalent to
+comparing @var{s1} and @var{s2} with the @code{u8_normcoll} function.
+
+@var{nf} must be either @code{UNINORM_NFC} or @code{UNINORM_NFKC}.
+@end deftypefun
+
+@deftypefun int u8_normcoll (const uint8_t *@var{s1}, size_t @var{n1}, const uint8_t *@var{s2}, size_t @var{n2}, uninorm_t @var{nf}, int *@var{resultp})
+@deftypefunx int u16_normcoll (const uint16_t *@var{s1}, size_t @var{n1}, const uint16_t *@var{s2}, size_t @var{n2}, uninorm_t @var{nf}, int *@var{resultp})
+@deftypefunx int u32_normcoll (const uint32_t *@var{s1}, size_t @var{n1}, const uint32_t *@var{s2}, size_t @var{n2}, uninorm_t @var{nf}, int *@var{resultp})
+Compares @var{s1} and @var{s2}, ignoring differences in normalization, using
+the collation rules of the current locale.
+
+@var{nf} must be either @code{UNINORM_NFC} or @code{UNINORM_NFKC}.
+
+If successful, sets @code{*@var{resultp}} to -1 if @var{s1} < @var{s2},
+0 if @var{s1} = @var{s2}, 1 if @var{s1} > @var{s2}, and returns 0.
+Upon failure, returns -1 with @code{errno} set.
+@end deftypefun
+
+@node Normalization of streams
+@section Normalization of streams of Unicode characters
+
+@cindex stream, normalizing a
+A ``stream of Unicode characters'' is essentially a function that accepts an
+@code{ucs4_t} argument repeatedly, optionally combined with a function that
+``flushes'' the stream.
+
+@deftp Type {struct uninorm_filter}
+This is the data type of a stream of Unicode characters that normalizes its
+input according to a given normalization form and passes the normalized
+character sequence to the encapsulated stream of Unicode characters.
+@end deftp
+
+@deftypefun {struct uninorm_filter *} uninorm_filter_create (uninorm_t @var{nf}, int (*@var{stream_func}) (void *@var{stream_data}, ucs4_t @var{uc}), void *@var{stream_data})
+Creates and returns a normalization filter for Unicode characters.
+
+The pair (@var{stream_func}, @var{stream_data}) is the encapsulated stream.
+@code{@var{stream_func} (@var{stream_data}, @var{uc})} receives the Unicode
+character @var{uc} and returns 0 if successful, or -1 with @code{errno} set
+upon failure.
+
+Returns the new filter, or NULL with @code{errno} set upon failure.
+@end deftypefun
+
+@deftypefun int uninorm_filter_write (struct uninorm_filter *@var{filter}, ucs4_t @var{uc})
+Stuffs a Unicode character into a normalizing filter.
+Returns 0 if successful, or -1 with @code{errno} set upon failure.
+@end deftypefun
+
+@deftypefun int uninorm_filter_flush (struct uninorm_filter *@var{filter})
+Brings data buffered in the filter to its destination, the encapsulated stream.
+
+Returns 0 if successful, or -1 with @code{errno} set upon failure.
+
+Note! If after calling this function, additional characters are written
+into the filter, the resulting character sequence in the encapsulated stream
+will not necessarily be normalized.
+@end deftypefun
+
+@deftypefun int uninorm_filter_free (struct uninorm_filter *@var{filter})
+Brings data buffered in the filter to its destination, the encapsulated stream,
+then closes and frees the filter.
+
+Returns 0 if successful, or -1 with @code{errno} set upon failure.
+@end deftypefun
diff --git a/doc/uniregex.texi b/doc/uniregex.texi
new file mode 100644
index 00000000..ae290ffa
--- /dev/null
+++ b/doc/uniregex.texi
@@ -0,0 +1,5 @@
+@node uniregex.h
+@chapter Regular expressions @code{<uniregex.h>}
+
+@cindex regular expression
+This include file is not yet implemented.
diff --git a/doc/unistdio.texi b/doc/unistdio.texi
new file mode 100644
index 00000000..e1fb9cfa
--- /dev/null
+++ b/doc/unistdio.texi
@@ -0,0 +1,197 @@
+@node unistdio.h
+@chapter Output with Unicode strings @code{<unistdio.h>}
+
+@cindex formatted output
+@cindex output, formatted
+This include file declares functions for doing formatted output with Unicode
+strings. It defines a set of functions similar to @code{fprintf} and
+@code{sprintf}, which are declared in @code{<stdio.h>}.
+
+These functions work like the @code{printf} function family.
+In the format string:
+@itemize
+@item
+The format directive @samp{U} takes an UTF-8 string (@code{const uint8_t *}).
+@item
+The format directive @samp{lU} takes an UTF-16 string
+(@code{const uint16_t *}).
+@item
+The format directive @samp{llU} takes an UTF-32 string
+(@code{const uint32_t *}).
+@end itemize
+
+A function name with an infix @samp{v} indicates that a @code{va_list} is
+passed instead of multiple arguments.
+
+The functions @code{*sprintf} have a @var{buf} argument that is assumed to be
+large enough.
+(@emph{DANGEROUS! Overflowing the buffer will crash the program.})
+
+The functions @code{*snprintf} have a @var{buf} argument that is assumed to be
+@var{size} units large. (@emph{DANGEROUS! The resulting string might be
+truncated in the middle of a multibyte character.})
+
+The functions @code{*asprintf} have a @var{resultp} argument. The result will
+be freshly allocated and stored in @code{*resultp}.
+
+The functions @code{*asnprintf} have a (@var{resultbuf}, @var{lengthp})
+argument pair. If @var{resultbuf} is not NULL and the result fits into
+@code{*@var{lengthp}} units, it is put in @var{resultbuf}, and @var{resultbuf}
+is returned. Otherwise, a freshly allocated string is returned. In both
+cases, @code{*@var{lengthp}} is set to the length (number of units) of the
+returned string. In case of error, NULL is returned and @code{errno} is set.
+
+The following functions take an ASCII format string and return a result that
+is a @code{char *} string in locale encoding.
+
+@deftypefun int ulc_sprintf (char *@var{buf}, const char *@var{format}, ...)
+@end deftypefun
+
+@deftypefun int ulc_snprintf (char *@var{buf}, size_t size, const char *@var{format}, ...)
+@end deftypefun
+
+@deftypefun int ulc_asprintf (char **@var{resultp}, const char *@var{format}, ...)
+@end deftypefun
+
+@deftypefun {char *} ulc_asnprintf (char *@var{resultbuf}, size_t *@var{lengthp}, const char *@var{format}, ...)
+@end deftypefun
+
+@deftypefun int ulc_vsprintf (char *@var{buf}, const char *@var{format}, va_list @var{ap})
+@end deftypefun
+
+@deftypefun int ulc_vsnprintf (char *@var{buf}, size_t size, const char *@var{format}, va_list @var{ap})
+@end deftypefun
+
+@deftypefun int ulc_vasprintf (char **@var{resultp}, const char *@var{format}, va_list @var{ap})
+@end deftypefun
+
+@deftypefun {char *} ulc_vasnprintf (char *@var{resultbuf}, size_t *@var{lengthp}, const char *@var{format}, va_list @var{ap})
+@end deftypefun
+
+The following functions take an ASCII format string and return a result in
+UTF-8 format.
+
+@deftypefun int u8_sprintf (uint8_t *@var{buf}, const char *@var{format}, ...)
+@end deftypefun
+@deftypefun int u8_snprintf (uint8_t *@var{buf}, size_t @var{size}, const char *@var{format}, ...)
+@end deftypefun
+@deftypefun int u8_asprintf (uint8_t **@var{resultp}, const char *@var{format}, ...)
+@end deftypefun
+@deftypefun {uint8_t *} u8_asnprintf (uint8_t *@var{resultbuf}, size_t *@var{lengthp}, const char *@var{format}, ...)
+@end deftypefun
+@deftypefun int u8_vsprintf (uint8_t *@var{buf}, const char *@var{format}, va_list ap)
+@end deftypefun
+@deftypefun int u8_vsnprintf (uint8_t *@var{buf}, size_t @var{size}, const char *@var{format}, va_list @var{ap})
+@end deftypefun
+@deftypefun int u8_vasprintf (uint8_t **@var{resultp}, const char *@var{format}, va_list @var{ap})
+@end deftypefun
+@deftypefun {uint8_t *} u8_vasnprintf (uint8_t *resultbuf, size_t *@var{lengthp}, const char *@var{format}, va_list @var{ap})
+@end deftypefun
+
+The following functions take an UTF-8 format string and return a result in
+UTF-8 format.
+
+@deftypefun int u8_u8_sprintf (uint8_t *@var{buf}, const uint8_t *@var{format}, ...)
+@end deftypefun
+@deftypefun int u8_u8_snprintf (uint8_t *@var{buf}, size_t @var{size}, const uint8_t *@var{format}, ...)
+@end deftypefun
+@deftypefun int u8_u8_asprintf (uint8_t **@var{resultp}, const uint8_t *@var{format}, ...)
+@end deftypefun
+@deftypefun {uint8_t *} u8_u8_asnprintf (uint8_t *resultbuf, size_t *@var{lengthp}, const uint8_t *@var{format}, ...)
+@end deftypefun
+@deftypefun int u8_u8_vsprintf (uint8_t *@var{buf}, const uint8_t *@var{format}, va_list @var{ap})
+@end deftypefun
+@deftypefun int u8_u8_vsnprintf (uint8_t *@var{buf}, size_t @var{size}, const uint8_t *@var{format}, va_list @var{ap})
+@end deftypefun
+@deftypefun int u8_u8_vasprintf (uint8_t **@var{resultp}, const uint8_t *@var{format}, va_list @var{ap})
+@end deftypefun
+@deftypefun {uint8_t *} u8_u8_vasnprintf (uint8_t *resultbuf, size_t *@var{lengthp}, const uint8_t *@var{format}, va_list @var{ap})
+@end deftypefun
+
+The following functions take an ASCII format string and return a result in
+UTF-16 format.
+
+@deftypefun int u16_sprintf (uint16_t *@var{buf}, const char *@var{format}, ...)
+@end deftypefun
+@deftypefun int u16_snprintf (uint16_t *@var{buf}, size_t @var{size}, const char *@var{format}, ...)
+@end deftypefun
+@deftypefun int u16_asprintf (uint16_t **@var{resultp}, const char *@var{format}, ...)
+@end deftypefun
+@deftypefun {uint16_t *} u16_asnprintf (uint16_t *@var{resultbuf}, size_t *@var{lengthp}, const char *@var{format}, ...)
+@end deftypefun
+@deftypefun int u16_vsprintf (uint16_t *@var{buf}, const char *@var{format}, va_list ap)
+@end deftypefun
+@deftypefun int u16_vsnprintf (uint16_t *@var{buf}, size_t @var{size}, const char *@var{format}, va_list @var{ap})
+@end deftypefun
+@deftypefun int u16_vasprintf (uint16_t **@var{resultp}, const char *@var{format}, va_list @var{ap})
+@end deftypefun
+@deftypefun {uint16_t *} u16_vasnprintf (uint16_t *resultbuf, size_t *@var{lengthp}, const char *@var{format}, va_list @var{ap})
+@end deftypefun
+
+The following functions take an UTF-16 format string and return a result in
+UTF-16 format.
+
+@deftypefun int u16_u16_sprintf (uint16_t *@var{buf}, const uint16_t *@var{format}, ...)
+@end deftypefun
+@deftypefun int u16_u16_snprintf (uint16_t *@var{buf}, size_t @var{size}, const uint16_t *@var{format}, ...)
+@end deftypefun
+@deftypefun int u16_u16_asprintf (uint16_t **@var{resultp}, const uint16_t *@var{format}, ...)
+@end deftypefun
+@deftypefun {uint16_t *} u16_u16_asnprintf (uint16_t *resultbuf, size_t *@var{lengthp}, const uint16_t *@var{format}, ...)
+@end deftypefun
+@deftypefun int u16_u16_vsprintf (uint16_t *@var{buf}, const uint16_t *@var{format}, va_list @var{ap})
+@end deftypefun
+@deftypefun int u16_u16_vsnprintf (uint16_t *@var{buf}, size_t @var{size}, const uint16_t *@var{format}, va_list @var{ap})
+@end deftypefun
+@deftypefun int u16_u16_vasprintf (uint16_t **@var{resultp}, const uint16_t *@var{format}, va_list @var{ap})
+@end deftypefun
+@deftypefun {uint16_t *} u16_u16_vasnprintf (uint16_t *resultbuf, size_t *@var{lengthp}, const uint16_t *@var{format}, va_list @var{ap})
+@end deftypefun
+
+The following functions take an ASCII format string and return a result in
+UTF-32 format.
+
+@deftypefun int u32_sprintf (uint32_t *@var{buf}, const char *@var{format}, ...)
+@end deftypefun
+@deftypefun int u32_snprintf (uint32_t *@var{buf}, size_t @var{size}, const char *@var{format}, ...)
+@end deftypefun
+@deftypefun int u32_asprintf (uint32_t **@var{resultp}, const char *@var{format}, ...)
+@end deftypefun
+@deftypefun {uint32_t *} u32_asnprintf (uint32_t *@var{resultbuf}, size_t *@var{lengthp}, const char *@var{format}, ...)
+@end deftypefun
+@deftypefun int u32_vsprintf (uint32_t *@var{buf}, const char *@var{format}, va_list ap)
+@end deftypefun
+@deftypefun int u32_vsnprintf (uint32_t *@var{buf}, size_t @var{size}, const char *@var{format}, va_list @var{ap})
+@end deftypefun
+@deftypefun int u32_vasprintf (uint32_t **@var{resultp}, const char *@var{format}, va_list @var{ap})
+@end deftypefun
+@deftypefun {uint32_t *} u32_vasnprintf (uint32_t *resultbuf, size_t *@var{lengthp}, const char *@var{format}, va_list @var{ap})
+@end deftypefun
+
+The following functions take an UTF-32 format string and return a result in
+UTF-32 format.
+
+@deftypefun int u32_u32_sprintf (uint32_t *@var{buf}, const uint32_t *@var{format}, ...)
+@end deftypefun
+@deftypefun int u32_u32_snprintf (uint32_t *@var{buf}, size_t @var{size}, const uint32_t *@var{format}, ...)
+@end deftypefun
+@deftypefun int u32_u32_asprintf (uint32_t **@var{resultp}, const uint32_t *@var{format}, ...)
+@end deftypefun
+@deftypefun {uint32_t *} u32_u32_asnprintf (uint32_t *resultbuf, size_t *@var{lengthp}, const uint32_t *@var{format}, ...)
+@end deftypefun
+@deftypefun int u32_u32_vsprintf (uint32_t *@var{buf}, const uint32_t *@var{format}, va_list @var{ap})
+@end deftypefun
+@deftypefun int u32_u32_vsnprintf (uint32_t *@var{buf}, size_t @var{size}, const uint32_t *@var{format}, va_list @var{ap})
+@end deftypefun
+@deftypefun int u32_u32_vasprintf (uint32_t **@var{resultp}, const uint32_t *@var{format}, va_list @var{ap})
+@end deftypefun
+@deftypefun {uint32_t *} u32_u32_vasnprintf (uint32_t *resultbuf, size_t *@var{lengthp}, const uint32_t *@var{format}, va_list @var{ap})
+@end deftypefun
+
+The following functions take an ASCII format string and produce output in
+locale encoding to a @code{FILE} stream.
+
+@deftypefun int ulc_fprintf (FILE *@var{stream}, const char *@var{format}, ...)
+@end deftypefun
+@deftypefun int ulc_vfprintf (FILE *@var{stream}, const char *@var{format}, va_list @var{ap})
+@end deftypefun
diff --git a/doc/unistr.texi b/doc/unistr.texi
new file mode 100644
index 00000000..9c6261b2
--- /dev/null
+++ b/doc/unistr.texi
@@ -0,0 +1,493 @@
+@node unistr.h
+@chapter Elementary Unicode string functions @code{<unistr.h>}
+
+This include file declares elementary functions for Unicode strings. It is
+essentially the equivalent of what @code{<string.h>} is for C strings.
+
+@menu
+* Elementary string checks::
+* Elementary string conversions::
+* Elementary string functions::
+* Elementary string functions with memory allocation::
+* Elementary string functions on NUL terminated strings::
+@end menu
+
+@node Elementary string checks
+@section Elementary string checks
+
+@cindex validity
+@cindex verification
+The following function is available to verify the integrity of a Unicode string.
+
+@deftypefun {const uint8_t *} u8_check (const uint8_t *@var{s}, size_t @var{n})
+@deftypefunx {const uint16_t *} u16_check (const uint16_t *@var{s}, size_t @var{n})
+@deftypefunx {const uint32_t *} u32_check (const uint32_t *@var{s}, size_t @var{n})
+This function checks whether a Unicode string is well-formed.
+It returns NULL if valid, or a pointer to the first invalid unit otherwise.
+@end deftypefun
+
+@node Elementary string conversions
+@section Elementary string conversions
+
+@cindex converting
+The following functions perform conversions between the different forms of Unicode strings.
+
+@deftypefun {uint16_t *} u8_to_u16 (const uint8_t *@var{s}, size_t @var{n}, uint16_t *@var{resultbuf}, size_t *@var{lengthp})
+Converts an UTF-8 string to an UTF-16 string.
+@end deftypefun
+
+@deftypefun {uint32_t *} u8_to_u32 (const uint8_t *@var{s}, size_t @var{n}, uint32_t *@var{resultbuf}, size_t *@var{lengthp})
+Converts an UTF-8 string to an UTF-32 string.
+@end deftypefun
+
+@deftypefun {uint8_t *} u16_to_u8 (const uint16_t *@var{s}, size_t @var{n}, uint8_t *@var{resultbuf}, size_t *@var{lengthp})
+Converts an UTF-16 string to an UTF-8 string.
+@end deftypefun
+
+@deftypefun {uint32_t *} u16_to_u32 (const uint16_t *@var{s}, size_t @var{n}, uint32_t *@var{resultbuf}, size_t *@var{lengthp})
+Converts an UTF-16 string to an UTF-32 string.
+@end deftypefun
+
+@deftypefun {uint8_t *} u32_to_u8 (const uint32_t *@var{s}, size_t @var{n}, uint8_t *@var{resultbuf}, size_t *@var{lengthp})
+Converts an UTF-32 string to an UTF-8 string.
+@end deftypefun
+
+@deftypefun {uint16_t *} u32_to_u16 (const uint32_t *@var{s}, size_t @var{n}, uint16_t *@var{resultbuf}, size_t *@var{lengthp})
+Converts an UTF-32 string to an UTF-16 string.
+@end deftypefun
+
+@node Elementary string functions
+@section Elementary string functions
+
+@cindex iterating
+The following functions inspect and return details about the first character
+in a Unicode string.
+
+@deftypefun int u8_mblen (const uint8_t *@var{s}, size_t @var{n})
+@deftypefunx int u16_mblen (const uint16_t *@var{s}, size_t @var{n})
+@deftypefunx int u32_mblen (const uint32_t *@var{s}, size_t @var{n})
+Returns the length (number of units) of the first character in @var{s}, which
+is no longer than @var{n}. Returns 0 if it is the NUL character. Returns -1
+upon failure.
+
+This function is similar to @posixfunc{mblen}, except that it operates on a
+Unicode string and that @var{s} must not be NULL.
+@end deftypefun
+
+@deftypefun int u8_mbtouc_unsafe (ucs4_t *@var{puc}, const uint8_t *@var{s}, size_t @var{n})
+@deftypefunx int u16_mbtouc_unsafe (ucs4_t *@var{puc}, const uint16_t *@var{s}, size_t @var{n})
+@deftypefunx int u32_mbtouc_unsafe (ucs4_t *@var{puc}, const uint32_t *@var{s}, size_t @var{n})
+Returns the length (number of units) of the first character in @var{s},
+putting its @code{ucs4_t} representation in @code{*@var{puc}}. Upon failure,
+@code{*@var{puc}} is set to @code{0xfffd}, and an appropriate number of units
+is returned.
+
+The number of available units, @var{n}, must be > 0.
+
+This function is similar to @posixfunc{mbtowc}, except that it operates on a
+Unicode string, @var{puc} and @var{s} must not be NULL, @var{n} must be > 0,
+and the NUL character is not treated specially.
+@end deftypefun
+
+@deftypefun int u8_mbtouc (ucs4_t *@var{puc}, const uint8_t *@var{s}, size_t @var{n})
+@deftypefunx int u16_mbtouc (ucs4_t *@var{puc}, const uint16_t *@var{s}, size_t @var{n})
+@deftypefunx int u32_mbtouc (ucs4_t *@var{puc}, const uint32_t *@var{s}, size_t @var{n})
+This function is like @code{u8_mbtouc_unsafe}, except that it will detect an
+invalid UTF-8 character, even if the library is compiled without
+@option{--enable-safety}.
+@end deftypefun
+
+@deftypefun int u8_mbtoucr (ucs4_t *@var{puc}, const uint8_t *@var{s}, size_t @var{n})
+@deftypefunx int u16_mbtoucr (ucs4_t *@var{puc}, const uint16_t *@var{s}, size_t @var{n})
+@deftypefunx int u32_mbtoucr (ucs4_t *@var{puc}, const uint32_t *@var{s}, size_t @var{n})
+Returns the length (number of units) of the first character in @var{s},
+putting its @code{ucs4_t} representation in @code{*@var{puc}}. Upon failure,
+@code{*@var{puc}} is set to @code{0xfffd}, and -1 is returned for an invalid
+sequence of units, -2 is returned for an incomplete sequence of units.
+
+The number of available units, @var{n}, must be > 0.
+
+This function is similar to @code{u8_mbtouc}, except that the return value
+gives more details about the failure, similar to @posixfunc{mbrtowc}.
+@end deftypefun
+
+The following function stores a Unicode character as a Unicode string in
+memory.
+
+@deftypefun int u8_uctomb (uint8_t *@var{s}, ucs4_t @var{uc}, int @var{n})
+@deftypefunx int u16_uctomb (uint16_t *@var{s}, ucs4_t @var{uc}, int @var{n})
+@deftypefunx int u32_uctomb (uint32_t *@var{s}, ucs4_t @var{uc}, int @var{n})
+Puts the multibyte character represented by @var{uc} in @var{s}, returning its
+length. Returns -1 upon failure, -2 if the number of available units, @var{n},
+is too small. The latter case cannot occur if @var{n} >= 6/2/1, respectively.
+
+This function is similar to @posixfunc{wctomb}, except that it operates on a
+Unicode strings, @var{s} must not be NULL, and the argument @var{n} must be
+specified.
+@end deftypefun
+
+@cindex copying
+The following functions copy Unicode strings in memory.
+
+@deftypefun {uint8_t *} u8_cpy (uint8_t *@var{dest}, const uint8_t *@var{src}, size_t @var{n})
+@deftypefunx {uint16_t *} u16_cpy (uint16_t *@var{dest}, const uint16_t *@var{src}, size_t @var{n})
+@deftypefunx {uint32_t *} u32_cpy (uint32_t *@var{dest}, const uint32_t *@var{src}, size_t @var{n})
+Copies @var{n} units from @var{src} to @var{dest}.
+
+This function is similar to @posixfunc{memcpy}, except that it operates on
+Unicode strings.
+@end deftypefun
+
+@deftypefun {uint8_t *} u8_move (uint8_t *@var{dest}, const uint8_t *@var{src}, size_t @var{n})
+@deftypefunx {uint16_t *} u16_move (uint16_t *@var{dest}, const uint16_t *@var{src}, size_t @var{n})
+@deftypefunx {uint32_t *} u32_move (uint32_t *@var{dest}, const uint32_t *@var{src}, size_t @var{n})
+Copies @var{n} units from @var{src} to @var{dest}, guaranteeing correct
+behavior for overlapping memory areas.
+
+This function is similar to @posixfunc{memmove}, except that it operates on
+Unicode strings.
+@end deftypefun
+
+The following function fills a Unicode string.
+
+@deftypefun {uint8_t *} u8_set (uint8_t *@var{s}, ucs4_t @var{uc}, size_t @var{n})
+@deftypefunx {uint16_t *} u16_set (uint16_t *@var{s}, ucs4_t @var{uc}, size_t @var{n})
+@deftypefunx {uint32_t *} u32_set (uint32_t *@var{s}, ucs4_t @var{uc}, size_t @var{n})
+Sets the first @var{n} characters of @var{s} to @var{uc}. @var{uc} should be
+a character that occupies only 1 unit.
+
+This function is similar to @posixfunc{memset}, except that it operates on
+Unicode strings.
+@end deftypefun
+
+@cindex comparing
+The following function compares two Unicode strings of the same length.
+
+@deftypefun int u8_cmp (const uint8_t *@var{s1}, const uint8_t *@var{s2}, size_t @var{n})
+@deftypefunx int u16_cmp (const uint16_t *@var{s1}, const uint16_t *@var{s2}, size_t @var{n})
+@deftypefunx int u32_cmp (const uint32_t *@var{s1}, const uint32_t *@var{s2}, size_t @var{n})
+Compares @var{s1} and @var{s2}, each of length @var{n}, lexicographically.
+Returns a negative value if @var{s1} compares smaller than @var{s2},
+a positive value if @var{s1} compares larger than @var{s2}, or 0 if
+they compare equal.
+
+This function is similar to @posixfunc{memcmp}, except that it operates on
+Unicode strings.
+@end deftypefun
+
+The following function compares two Unicode strings of possibly different
+lengths.
+
+@deftypefun int u8_cmp2 (const uint8_t *@var{s1}, size_t @var{n1}, const uint8_t *@var{s2}, size_t @var{n2})
+@deftypefunx int u16_cmp2 (const uint16_t *@var{s1}, size_t @var{n1}, const uint16_t *@var{s2}, size_t @var{n2})
+@deftypefunx int u32_cmp2 (const uint32_t *@var{s1}, size_t @var{n1}, const uint32_t *@var{s2}, size_t @var{n2})
+Compares @var{s1} and @var{s2}, lexicographically.
+Returns a negative value if @var{s1} compares smaller than @var{s2},
+a positive value if @var{s1} compares larger than @var{s2}, or 0 if
+they compare equal.
+
+This function is similar to the gnulib function @func{memcmp2}, except that it
+operates on Unicode strings.
+@end deftypefun
+
+@cindex searching, for a character
+The following function searches for a given Unicode character.
+
+@deftypefun {uint8_t *} u8_chr (const uint8_t *@var{s}, size_t @var{n}, ucs4_t @var{uc})
+@deftypefunx {uint16_t *} u16_chr (const uint16_t *@var{s}, size_t @var{n}, ucs4_t @var{uc})
+@deftypefunx {uint32_t *} u32_chr (const uint32_t *@var{s}, size_t @var{n}, ucs4_t @var{uc})
+Searches the string at @var{s} for @var{uc}. Returns a pointer to the first
+occurrence of @var{uc} in @var{s}, or NULL if @var{uc} does not occur in
+@var{s}.
+
+This function is similar to @posixfunc{memchr}, except that it operates on
+Unicode strings.
+@end deftypefun
+
+@cindex counting
+The following function counts the number of Unicode characters.
+
+@deftypefun size_t u8_mbsnlen (const uint8_t *@var{s}, size_t @var{n})
+@deftypefunx size_t u16_mbsnlen (const uint16_t *@var{s}, size_t @var{n})
+@deftypefunx size_t u32_mbsnlen (const uint32_t *@var{s}, size_t @var{n})
+Counts and returns the number of Unicode characters in the @var{n} units
+from @var{s}.
+
+This function is similar to the gnulib function @func{mbsnlen}, except that
+it operates on Unicode strings.
+@end deftypefun
+
+@node Elementary string functions with memory allocation
+@section Elementary string functions with memory allocation
+
+@cindex duplicating
+The following function copies a Unicode string.
+
+@deftypefun {uint8_t *} u8_cpy_alloc (const uint8_t *@var{s}, size_t @var{n})
+@deftypefunx {uint16_t *} u16_cpy_alloc (const uint16_t *@var{s}, size_t @var{n})
+@deftypefunx {uint32_t *} u32_cpy_alloc (const uint32_t *@var{s}, size_t @var{n})
+Makes a freshly allocated copy of @var{s}, of length @var{n}.
+@end deftypefun
+
+@node Elementary string functions on NUL terminated strings
+@section Elementary string functions on NUL terminated strings
+
+The following functions inspect and return details about the first character
+in a Unicode string.
+
+@deftypefun int u8_strmblen (const uint8_t *@var{s})
+@deftypefunx int u16_strmblen (const uint16_t *@var{s})
+@deftypefunx int u32_strmblen (const uint32_t *@var{s})
+Returns the length (number of units) of the first character in @var{s}.
+Returns 0 if it is the NUL character. Returns -1 upon failure.
+@end deftypefun
+
+@cindex iterating
+@deftypefun int u8_strmbtouc (ucs4_t *@var{puc}, const uint8_t *@var{s})
+@deftypefunx int u16_strmbtouc (ucs4_t *@var{puc}, const uint16_t *@var{s})
+@deftypefunx int u32_strmbtouc (ucs4_t *@var{puc}, const uint32_t *@var{s})
+Returns the length (number of units) of the first character in @var{s},
+putting its @code{ucs4_t} representation in @code{*@var{puc}}. Returns 0
+if it is the NUL character. Returns -1 upon failure.
+@end deftypefun
+
+@deftypefun {const uint8_t *} u8_next (ucs4_t *@var{puc}, const uint8_t *@var{s})
+@deftypefunx {const uint16_t *} u16_next (ucs4_t *@var{puc}, const uint16_t *@var{s})
+@deftypefunx {const uint32_t *} u32_next (ucs4_t *@var{puc}, const uint32_t *@var{s})
+Forward iteration step. Advances the pointer past the next character,
+or returns NULL if the end of the string has been reached. Puts the
+character's @code{ucs4_t} representation in @code{*@var{puc}}.
+@end deftypefun
+
+The following function inspects and returns details about the previous
+character in a Unicode string.
+
+@deftypefun {const uint8_t *} u8_prev (ucs4_t *@var{puc}, const uint8_t *@var{s}, const uint8_t *@var{start})
+@deftypefunx {const uint16_t *} u16_prev (ucs4_t *@var{puc}, const uint16_t *@var{s}, const uint16_t *@var{start})
+@deftypefunx {const uint32_t *} u32_prev (ucs4_t *@var{puc}, const uint32_t *@var{s}, const uint32_t *@var{start})
+Backward iteration step. Advances the pointer to point to the previous
+character, or returns NULL if the beginning of the string had been reached.
+Puts the character's @code{ucs4_t} representation in @code{*@var{puc}}.
+@end deftypefun
+
+The following functions determine the length of a Unicode string.
+
+@deftypefun size_t u8_strlen (const uint8_t *@var{s})
+@deftypefunx size_t u16_strlen (const uint16_t *@var{s})
+@deftypefunx size_t u32_strlen (const uint32_t *@var{s})
+Returns the number of units in @var{s}.
+
+This function is similar to @posixfunc{strlen} and @posixfunc{wcslen}, except
+that it operates on Unicode strings.
+@end deftypefun
+
+@deftypefun size_t u8_strnlen (const uint8_t *@var{s}, size_t @var{maxlen})
+@deftypefunx size_t u16_strnlen (const uint16_t *@var{s}, size_t @var{maxlen})
+@deftypefunx size_t u32_strnlen (const uint32_t *@var{s}, size_t @var{maxlen})
+Returns the number of units in @var{s}, but at most @var{maxlen}.
+
+This function is similar to @posixfunc{strnlen} and @posixfunc{wcsnlen}, except
+that it operates on Unicode strings.
+@end deftypefun
+
+@cindex copying
+The following functions copy portions of Unicode strings in memory.
+
+@deftypefun {uint8_t *} u8_strcpy (uint8_t *@var{dest}, const uint8_t *@var{src})
+@deftypefunx {uint16_t *} u16_strcpy (uint16_t *@var{dest}, const uint16_t *@var{src})
+@deftypefunx {uint32_t *} u32_strcpy (uint32_t *@var{dest}, const uint32_t *@var{src})
+Copies @var{src} to @var{dest}.
+
+This function is similar to @posixfunc{strcpy} and @posixfunc{wcscpy}, except
+that it operates on Unicode strings.
+@end deftypefun
+
+@deftypefun {uint8_t *} u8_stpcpy (uint8_t *@var{dest}, const uint8_t *@var{src})
+@deftypefunx {uint16_t *} u16_stpcpy (uint16_t *@var{dest}, const uint16_t *@var{src})
+@deftypefunx {uint32_t *} u32_stpcpy (uint32_t *@var{dest}, const uint32_t *@var{src})
+Copies @var{src} to @var{dest}, returning the address of the terminating NUL
+in @var{dest}.
+
+This function is similar to @posixfunc{stpcpy}, except that it operates on
+Unicode strings.
+@end deftypefun
+
+@deftypefun {uint8_t *} u8_strncpy (uint8_t *@var{dest}, const uint8_t *@var{src}, size_t @var{n})
+@deftypefunx {uint16_t *} u16_strncpy (uint16_t *@var{dest}, const uint16_t *@var{src}, size_t @var{n})
+@deftypefunx {uint32_t *} u32_strncpy (uint32_t *@var{dest}, const uint32_t *@var{src}, size_t @var{n})
+Copies no more than @var{n} units of @var{src} to @var{dest}.
+
+This function is similar to @posixfunc{strncpy} and @posixfunc{wcsncpy}, except
+that it operates on Unicode strings.
+@end deftypefun
+
+@deftypefun {uint8_t *} u8_stpncpy (uint8_t *@var{dest}, const uint8_t *@var{src}, size_t @var{n})
+@deftypefunx {uint16_t *} u16_stpncpy (uint16_t *@var{dest}, const uint16_t *@var{src}, size_t @var{n})
+@deftypefunx {uint32_t *} u32_stpncpy (uint32_t *@var{dest}, const uint32_t *@var{src}, size_t @var{n})
+Copies no more than @var{n} units of @var{src} to @var{dest}, returning the
+address of the last unit written into @var{dest}.
+
+This function is similar to @posixfunc{stpncpy}, except that it operates on
+Unicode strings.
+@end deftypefun
+
+@deftypefun {uint8_t *} u8_strcat (uint8_t *@var{dest}, const uint8_t *@var{src})
+@deftypefunx {uint16_t *} u16_strcat (uint16_t *@var{dest}, const uint16_t *@var{src})
+@deftypefunx {uint32_t *} u32_strcat (uint32_t *@var{dest}, const uint32_t *@var{src})
+Appends @var{src} onto @var{dest}.
+
+This function is similar to @posixfunc{strcat} and @posixfunc{wcscat}, except
+that it operates on Unicode strings.
+@end deftypefun
+
+@deftypefun {uint8_t *} u8_strncat (uint8_t *@var{dest}, const uint8_t *@var{src}, size_t @var{n})
+@deftypefunx {uint16_t *} u16_strncat (uint16_t *@var{dest}, const uint16_t *@var{src}, size_t @var{n})
+@deftypefunx {uint32_t *} u32_strncat (uint32_t *@var{dest}, const uint32_t *@var{src}, size_t @var{n})
+Appends no more than @var{n} units of @var{src} onto @var{dest}.
+
+This function is similar to @posixfunc{strncat} and @posixfunc{wcsncat}, except
+that it operates on Unicode strings.
+@end deftypefun
+
+@cindex comparing
+The following functions compare two Unicode strings.
+
+@deftypefun int u8_strcmp (const uint8_t *@var{s1}, const uint8_t *@var{s2})
+@deftypefunx int u16_strcmp (const uint16_t *@var{s1}, const uint16_t *@var{s2})
+@deftypefunx int u32_strcmp (const uint32_t *@var{s1}, const uint32_t *@var{s2})
+Compares @var{s1} and @var{s2}, lexicographically.
+Returns a negative value if @var{s1} compares smaller than @var{s2},
+a positive value if @var{s1} compares larger than @var{s2}, or 0 if
+they compare equal.
+
+This function is similar to @posixfunc{strcmp} and @posixfunc{wcscmp}, except
+that it operates on Unicode strings.
+@end deftypefun
+
+@cindex comparing, with collation rules
+@deftypefun int u8_strcoll (const uint8_t *@var{s1}, const uint8_t *@var{s2})
+@deftypefunx int u16_strcoll (const uint16_t *@var{s1}, const uint16_t *@var{s2})
+@deftypefunx int u32_strcoll (const uint32_t *@var{s1}, const uint32_t *@var{s2})
+Compares @var{s1} and @var{s2} using the collation rules of the current
+locale.
+Returns -1 if @var{s1} < @var{s2}, 0 if @var{s1} = @var{s2}, 1 if
+@var{s1} > @var{s2}. Upon failure, sets @code{errno} and returns any value.
+
+This function is similar to @posixfunc{strcoll} and @posixfunc{wcscoll}, except
+that it operates on Unicode strings.
+
+Note that this function may consider different canonical normalizations
+of the same string as having a large distance. It is therefore better to
+use the function @code{u8_normcoll} instead of this one; see @ref{uninorm.h}.
+@end deftypefun
+
+@deftypefun int u8_strncmp (const uint8_t *@var{s1}, const uint8_t *@var{s2}, size_t @var{n})
+@deftypefunx int u16_strncmp (const uint16_t *@var{s1}, const uint16_t *@var{s2}, size_t @var{n})
+@deftypefunx int u32_strncmp (const uint32_t *@var{s1}, const uint32_t *@var{s2}, size_t @var{n})
+Compares no more than @var{n} units of @var{s1} and @var{s2}.
+
+This function is similar to @posixfunc{strncmp} and @posixfunc{wcsncmp}, except
+that it operates on Unicode strings.
+@end deftypefun
+
+@cindex duplicating
+The following function allocates a duplicate of a Unicode string.
+
+@deftypefun {uint8_t *} u8_strdup (const uint8_t *@var{s})
+@deftypefunx {uint16_t *} u16_strdup (const uint16_t *@var{s})
+@deftypefunx {uint32_t *} u32_strdup (const uint32_t *@var{s})
+Duplicates @var{s}, returning an identical malloc'd string.
+
+This function is similar to @posixfunc{strdup} and @posixfunc{wcsdup}, except
+that it operates on Unicode strings.
+@end deftypefun
+
+@cindex searching, for a character
+The following functions search for a given Unicode character.
+
+@deftypefun {uint8_t *} u8_strchr (const uint8_t *@var{str}, ucs4_t @var{uc})
+@deftypefunx {uint16_t *} u16_strchr (const uint16_t *@var{str}, ucs4_t @var{uc})
+@deftypefunx {uint32_t *} u32_strchr (const uint32_t *@var{str}, ucs4_t @var{uc})
+Finds the first occurrence of @var{uc} in @var{str}.
+
+This function is similar to @posixfunc{strchr} and @posixfunc{wcschr}, except
+that it operates on Unicode strings.
+@end deftypefun
+
+@deftypefun {uint8_t *} u8_strrchr (const uint8_t *@var{str}, ucs4_t @var{uc})
+@deftypefunx {uint16_t *} u16_strrchr (const uint16_t *@var{str}, ucs4_t @var{uc})
+@deftypefunx {uint32_t *} u32_strrchr (const uint32_t *@var{str}, ucs4_t @var{uc})
+Finds the last occurrence of @var{uc} in @var{str}.
+
+This function is similar to @posixfunc{strrchr} and @posixfunc{wcsrchr}, except
+that it operates on Unicode strings.
+@end deftypefun
+
+The following functions search for the first occurrence of some Unicode
+character in or outside a given set of Unicode characters.
+
+@deftypefun size_t u8_strcspn (const uint8_t *@var{str}, const uint8_t *@var{reject})
+@deftypefunx size_t u16_strcspn (const uint16_t *@var{str}, const uint16_t *@var{reject})
+@deftypefunx size_t u32_strcspn (const uint32_t *@var{str}, const uint32_t *@var{reject})
+Returns the length of the initial segment of @var{str} which consists entirely
+of Unicode characters not in @var{reject}.
+
+This function is similar to @posixfunc{strcspn} and @posixfunc{wcscspn}, except
+that it operates on Unicode strings.
+@end deftypefun
+
+@deftypefun size_t u8_strspn (const uint8_t *@var{str}, const uint8_t *@var{accept})
+@deftypefunx size_t u16_strspn (const uint16_t *@var{str}, const uint16_t *@var{accept})
+@deftypefunx size_t u32_strspn (const uint32_t *@var{str}, const uint32_t *@var{accept})
+Returns the length of the initial segment of @var{str} which consists entirely
+of Unicode characters in @var{accept}.
+
+This function is similar to @posixfunc{strspn} and @posixfunc{wcsspn}, except
+that it operates on Unicode strings.
+@end deftypefun
+
+@deftypefun {uint8_t *} u8_strpbrk (const uint8_t *@var{str}, const uint8_t *@var{accept})
+@deftypefunx {uint16_t *} u16_strpbrk (const uint16_t *@var{str}, const uint16_t *@var{accept})
+@deftypefunx {uint32_t *} u32_strpbrk (const uint32_t *@var{str}, const uint32_t *@var{accept})
+Finds the first occurrence in @var{str} of any character in @var{accept}.
+
+This function is similar to @posixfunc{strpbrk} and @posixfunc{wcspbrk}, except
+that it operates on Unicode strings.
+@end deftypefun
+
+@cindex searching, for a substring
+The following functions search whether a given Unicode string is a substring
+of another Unicode string.
+
+@deftypefun {uint8_t *} u8_strstr (const uint8_t *@var{haystack}, const uint8_t *@var{needle})
+@deftypefunx {uint16_t *} u16_strstr (const uint16_t *@var{haystack}, const uint16_t *@var{needle})
+@deftypefunx {uint32_t *} u32_strstr (const uint32_t *@var{haystack}, const uint32_t *@var{needle})
+Finds the first occurrence of @var{needle} in @var{haystack}.
+
+This function is similar to @posixfunc{strstr} and @posixfunc{wcsstr}, except
+that it operates on Unicode strings.
+@end deftypefun
+
+@deftypefun bool u8_startswith (const uint8_t *@var{str}, const uint8_t *@var{prefix})
+@deftypefunx bool u16_startswith (const uint16_t *@var{str}, const uint16_t *@var{prefix})
+@deftypefunx bool u32_startswith (const uint32_t *@var{str}, const uint32_t *@var{prefix})
+Tests whether @var{str} starts with @var{prefix}.
+@end deftypefun
+
+@deftypefun bool u8_endswith (const uint8_t *@var{str}, const uint8_t *@var{suffix})
+@deftypefunx bool u16_endswith (const uint16_t *@var{str}, const uint16_t *@var{suffix})
+@deftypefunx bool u32_endswith (const uint32_t *@var{str}, const uint32_t *@var{suffix})
+Tests whether @var{str} ends with @var{suffix}.
+@end deftypefun
+
+The following function does one step in tokenizing a Unicode string.
+
+@deftypefun {uint8_t *} u8_strtok (uint8_t *@var{str}, const uint8_t *@var{delim}, uint8_t **@var{ptr})
+@deftypefunx {uint16_t *} u16_strtok (uint16_t *@var{str}, const uint16_t *@var{delim}, uint16_t **@var{ptr})
+@deftypefunx {uint32_t *} u32_strtok (uint32_t *@var{str}, const uint32_t *@var{delim}, uint32_t **@var{ptr})
+Divides @var{str} into tokens separated by characters in @var{delim}.
+
+This function is similar to @posixfunc{strtok_r} and @posixfunc{wcstok}, except
+that it operates on Unicode strings. Its interface is actually more similar to
+@code{wcstok} than to @code{strtok}.
+@end deftypefun
diff --git a/doc/unitypes.texi b/doc/unitypes.texi
new file mode 100644
index 00000000..696ba881
--- /dev/null
+++ b/doc/unitypes.texi
@@ -0,0 +1,15 @@
+@node unitypes.h
+@chapter Elementary types @code{<unitypes.h>}
+
+The include file @code{<unitypes.h>} provides the following basic types.
+
+@deftp Type uint8_t
+@deftpx Type uint16_t
+@deftpx Type uint32_t
+These are the storage units of UTF-8/16/32 strings, respectively. The definitions are
+taken from @code{<stdint.h>}, on platforms where this include file is present.
+@end deftp
+
+@deftp Type ucs4_t
+This type represents a single Unicode character, outside of an UTF-32 string.
+@end deftp
diff --git a/doc/uniwbrk.texi b/doc/uniwbrk.texi
new file mode 100644
index 00000000..6f06b926
--- /dev/null
+++ b/doc/uniwbrk.texi
@@ -0,0 +1,71 @@
+@node uniwbrk.h
+@chapter Word breaks in strings @code{<uniwbrk.h>}
+
+@cindex word breaks
+@cindex breaks, word
+This include file declares functions for determining where in a string
+``words'' start and end. Here ``words'' are not necessarily the same as
+entities that can be looked up in dictionaries, but rather groups of
+consecutive characters that should not be split by text processing
+operations.
+
+@menu
+* Word breaks in a string::
+* Word break property::
+@end menu
+
+@node Word breaks in a string
+@section Word breaks in a string
+
+The following functions determine the word breaks in a string.
+
+@deftypefun void u8_wordbreaks (const uint8_t *@var{s}, size_t @var{n}, char *@var{p})
+@deftypefunx void u16_wordbreaks (const uint16_t *@var{s}, size_t @var{n}, char *@var{p})
+@deftypefunx void u32_wordbreaks (const uint32_t *@var{s}, size_t @var{n}, char *@var{p})
+@deftypefunx void ulc_wordbreaks (const char *@var{s}, size_t @var{n}, char *@var{p})
+Determines the word break points in @var{s}, an array of @var{n} units, and
+stores the result at @code{@var{p}[0..@var{n}-1]}.
+@table @asis
+@item @code{@var{p}[i] = 1}
+means that there is a word boundary between @code{@var{s}[i-1]} and
+@code{@var{s}[i]}.
+@item @code{@var{p}[i] = 0}
+means that @code{@var{s}[i-1]} and @code{@var{s}[i]} must not be separated.
+@end table
+@code{@var{p}[0]} is always set to 0. If an application wants to consider a
+word break to be present at the beginning of the string (before
+@code{@var{s}[0]}) or at the end of the string (after
+@code{@var{s}[0..@var{n}-1]}), it has to treat these cases explicitly.
+@end deftypefun
+
+@node Word break property
+@section Word break property
+
+This is a more low-level API. The word break property is a property defined
+in Unicode Standard Annex #29, section ``Word Boundaries'', see
+@url{http://www.unicode.org/reports/tr29/#Word_Boundaries}.@texnl{} It is
+used for determining the word breaks in a string.
+
+The following are the possible values of the word break property. More values
+may be added in the future.
+
+@deftypevr Constant int WBP_OTHER
+@deftypevrx Constant int WBP_CR
+@deftypevrx Constant int WBP_LF
+@deftypevrx Constant int WBP_NEWLINE
+@deftypevrx Constant int WBP_EXTEND
+@deftypevrx Constant int WBP_FORMAT
+@deftypevrx Constant int WBP_KATAKANA
+@deftypevrx Constant int WBP_ALETTER
+@deftypevrx Constant int WBP_MIDNUMLET
+@deftypevrx Constant int WBP_MIDLETTER
+@deftypevrx Constant int WBP_MIDNUM
+@deftypevrx Constant int WBP_NUMERIC
+@deftypevrx Constant int WBP_EXTENDNUMLET
+@end deftypevr
+
+The following function looks up the word break property of a character.
+
+@deftypefun int uc_wordbreak_property (ucs4_t @var{uc})
+Returns the Word_Break property of a Unicode character.
+@end deftypefun
diff --git a/doc/uniwidth.texi b/doc/uniwidth.texi
new file mode 100644
index 00000000..a05d101d
--- /dev/null
+++ b/doc/uniwidth.texi
@@ -0,0 +1,43 @@
+@node uniwidth.h
+@chapter Display width @code{<uniwidth.h>}
+
+@cindex width
+This include file declares functions that return the display width, measured
+in columns, of characters or strings, when output to a device that uses
+non-proportional fonts.
+
+@cindex ambiguous width
+Note that for some rarely used characters the actual fonts or terminal
+emulators can use a different width. There is no mechanism for communicating
+the display width of characters across a Unix pseudo-terminal (tty). Also,
+there are scripts with complex rendering, like the Indic scripts. For these
+scripts, there is no such concept as non-proportional fonts. Therefore
+the results of these functions usually work fine on most scripts and on
+most characters but can fail to represent the actual display width.
+
+These functions are locale dependent. The @var{encoding} argument identifies
+the encoding (e.g@. @code{"ISO-8859-2"} for Polish).
+
+@cindex Unicode character, width
+@cindex halfwidth
+@cindex fullwidth
+@deftypefun int uc_width (ucs4_t @var{uc}, const char *@var{encoding})
+Determines and returns the number of column positions required for @var{uc}.
+Returns -1 if @var{uc} is a control character that has an influence on the
+column position when output.
+@end deftypefun
+
+@deftypefun int u8_width (const uint8_t *@var{s}, size_t @var{n}, const char *@var{encoding})
+@deftypefunx int u16_width (const uint16_t *@var{s}, size_t @var{n}, const char *@var{encoding})
+@deftypefunx int u32_width (const uint32_t *@var{s}, size_t @var{n}, const char *@var{encoding})
+Determines and returns the number of column positions required for first
+@var{n} units (or fewer if @var{s} ends before this) in @var{s}. This
+function ignores control characters in the string.
+@end deftypefun
+
+@deftypefun int u8_strwidth (const uint8_t *@var{s}, const char *@var{encoding})
+@deftypefunx int u16_strwidth (const uint16_t *@var{s}, const char *@var{encoding})
+@deftypefunx int u32_strwidth (const uint32_t *@var{s}, const char *@var{encoding})
+Determines and returns the number of column positions required for @var{s}.
+This function ignores control characters in the string.
+@end deftypefun
diff --git a/doc/version.texi b/doc/version.texi
new file mode 100644
index 00000000..ee4ba906
--- /dev/null
+++ b/doc/version.texi
@@ -0,0 +1,4 @@
+@set UPDATED 29 June 2009
+@set UPDATED-MONTH June 2009
+@set EDITION 0.9.1
+@set VERSION 0.9.1